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);
61 region.winx = data.region_winsize.x;
62 region.winy = data.region_winsize.y;
63 region.winrct = data.region_winrct;
72 char err_out[256] =
"unknown";
75 if (offscreen ==
nullptr) {
128 const int2 &win_size,
133 float clip_start, clip_end;
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;
209 const float point_size,
233 const float line_width)
243 const int cyclic_add = (cyclic && indices.size() > 2) ? 1 : 0;
246 for (
const int point_i :
indices) {
251 if (cyclic && indices.size() > 2) {
252 const int point_i = indices[0];
262 const int2 &win_size,
266 const bool is_fill_stroke)
273 data.keep_size =
false;
274 data.pixfactor = 1.0f;
277 data.caps_start = cap_start;
278 data.caps_end = cap_end;
279 data.fill_stroke = is_fill_stroke;
288 const int2 &win_size,
297 const bool fill_stroke,
298 const float radius_scale)
300 if (indices.is_empty()) {
312 GPUUniformBuf *ubo =
create_shader_ubo(rv3d, win_size,
object, cap_start, cap_end, fill_stroke);
316 const int cyclic_add = (cyclic && indices.size() > 2) ? 1 : 0;
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;
331 if (cyclic && indices.size() > 2) {
332 draw_point(indices.last() - 1);
335 draw_point(indices.first() + 1);
338 for (
const int point_i :
indices) {
342 if (cyclic && indices.size() > 2) {
343 draw_point(indices.first());
344 draw_point(indices.first() + 1);
348 draw_point(indices.last() - 1);
362 const float radius_scale)
364 if (indices.is_empty()) {
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;
400 const float2 &viewport_size,
401 const float line_width,
404 if (indices.is_empty()) {
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},
430 for (
const int point_i :
indices) {
431 const float radius = radii[point_i];
437 for (
const int i :
IndexRange(segments_num / 2)) {
440 if (segments_num - 1 - i > i) {
443 center +
float3(radius * scale * coords[segments_num - 1 - i], 0.0f));
458 for (
const int point_i :
indices) {
459 const float radius = radii[point_i];
465 for (
const int i :
IndexRange(segments_num)) {
495 for (
const int point_i :
indices) {
508 const int2 &win_size,
515 const float radius_scale)
531 const OffsetIndices points_by_curve = curves.points_by_curve();
546 const int material_index = materials[stroke_i];
564 points_by_curve[stroke_i],
577 draw_dots(transform, points_by_curve[stroke_i], positions, radii, colors, radius_scale);
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)
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])
eMaterialGPencilStyle_Mode
@ GP_MATERIAL_MODE_SQUARE
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()
void GPU_debug_capture_begin(const char *title)
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 GPU_matrix_identity_projection_set()
void GPU_matrix_identity_set()
#define GPU_matrix_set(x)
void GPU_matrix_push_projection()
void GPU_matrix_pop_projection()
#define GPU_matrix_projection_set(x)
void GPU_polygon_offset(float viewdist, float dist)
@ GPU_PRIM_LINE_STRIP_ADJ
@ 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)
void GPU_line_width(float width)
void GPU_depth_mask(bool depth)
void GPU_depth_test(eGPUDepthTest test)
bool GPU_depth_mask_get()
@ GPU_TEXTURE_USAGE_HOST_READ
void IMB_rect_from_float(ImBuf *ibuf)
Contains defines and structs used throughout the imbuf module.
const bke::CurvesGeometry & strokes() const
VArray< float > radii() 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
struct ImBuf * IMB_allocImBuf(unsigned int, unsigned int, unsigned char, unsigned int)
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 ®ion, const RegionViewData &data)
constexpr const float min_stroke_thickness
constexpr const bool enable_debug_gpu_capture
void set_view_matrix(const RegionView3D &rv3d)
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 ®ion, 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)
void clear_projection_matrix()
void set_projection_matrix(const RegionView3D &rv3d)
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
ImBufFloatBuffer float_buffer
ImBufByteBuffer byte_buffer
struct MaterialGPencilStyle * gp_style
const c_style_mat & ptr() const