10#include <fmt/format.h>
148 case PrimitiveType::Polyline:
149 case PrimitiveType::Line: {
152 case PrimitiveType::Box:
153 case PrimitiveType::Circle:
154 case PrimitiveType::Arc: {
157 case PrimitiveType::Curve: {
169 if (
ELEM(ptd.
type, PrimitiveType::Circle, PrimitiveType::Box)) {
174 if (
math::mod(point, num_shared_points) == 0) {
198 colors.fill(color_gizmo_primary);
199 sizes.
fill(size_primary);
203 if (
ELEM(ptd.
type, PrimitiveType::Box, PrimitiveType::Circle)) {
204 colors.fill(color_gizmo_primary);
205 sizes.
fill(size_primary);
212 colors.
fill(color_gizmo_secondary);
213 sizes.
fill(size_secondary);
215 for (
const int i : colors.index_range()) {
219 colors[i] = color_gizmo_b;
220 sizes[i] = size_tertiary;
224 colors.
last() = color_gizmo_primary;
225 sizes.
last() = size_primary;
227 if (
ELEM(ptd.
type, PrimitiveType::Line, PrimitiveType::Polyline)) {
228 colors.last(1) = color_gizmo_secondary;
229 sizes.
last(1) = size_primary;
234 if (active_index != -1) {
235 sizes[active_index] *= 1.5;
236 colors[active_index] =
math::interpolate(colors[active_index], color_gizmo_a, 0.5f);
259 const float size = sizes[
point];
261 immAttr4f(col3d, color[0], color[1], color[2], color[3]);
296 const int new_points_num = new_positions.
size();
299 new_positions.
fill(control_points.
last());
304 case PrimitiveType::Line:
305 case PrimitiveType::Polyline: {
307 const float t =
math::mod(i /
float(subdivision + 1), 1.0f);
308 const int point =
int(i / (subdivision + 1));
309 const int point_next = point + 1;
310 new_positions[i] =
math::interpolate(control_points[point], control_points[point_next], t);
312 new_positions.
last() = control_points.
last();
315 case PrimitiveType::Arc: {
317 const int num_segments = ptd.
segments;
318 for (
const int segment_i :
IndexRange(num_segments)) {
319 const float2 A = control_points[num_shared_points * segment_i + 0];
320 const float2 B = control_points[num_shared_points * segment_i + 1];
321 const float2 C = control_points[num_shared_points * segment_i + 2];
322 for (
const int i :
IndexRange(subdivision + 1)) {
323 const float t = i /
float(subdivision + 1);
329 new_positions.
last() = control_points.
last();
332 case PrimitiveType::Curve: {
334 const int num_segments = ptd.
segments;
336 for (
const int segment_i :
IndexRange(num_segments)) {
337 const float2 A = control_points[num_shared_points * segment_i + 0];
338 const float2 B = control_points[num_shared_points * segment_i + 1];
339 const float2 C = control_points[num_shared_points * segment_i + 2];
340 const float2 D = control_points[num_shared_points * segment_i + 3];
341 for (
const int i :
IndexRange(subdivision + 1)) {
342 const float t = i /
float(subdivision + 1);
348 new_positions[i + segment_i * (subdivision + 1)] =
math::interpolate(ABBC, BCCD, t);
351 new_positions.
last() = control_points.
last();
354 case PrimitiveType::Circle: {
358 const float t = i /
float(new_points_num);
364 case PrimitiveType::Box: {
382 const float2 C = center + offset *
float2(-1.0f, -1.0f);
386 const float t =
math::mod(i /
float(subdivision + 1), 1.0f);
387 const int point =
int(i / (subdivision + 1));
388 const int point_next =
math::mod(point + 1, 4);
418 case PrimitiveType::Polyline:
419 case PrimitiveType::Curve:
420 case PrimitiveType::Line:
421 case PrimitiveType::Circle:
422 case PrimitiveType::Arc: {
423 const int join_points = ptd.
segments + 1;
424 return join_points + subdivision * ptd.
segments;
427 case PrimitiveType::Box: {
428 return 4 + subdivision * 4;
441 const int last_points_num = curves.
points_by_curve()[curves.curves_range().last()].size();
444 curves.resize(curves.points_num() - last_points_num + new_points_num, curves.curves_num());
445 curves.offsets_for_write().last() = curves.points_num();
446 const IndexRange curve_points = curves.points_by_curve()[curves.curves_range().last()];
462 for (
const int point : curve_points.
index_range()) {
463 float pressure = 1.0f;
466 const float t = point /
float(new_points_num - 1);
480 new_radii[
point] = radius;
481 new_opacities[
point] = opacity;
483 point_attributes_to_skip.
add_multiple({
"position",
"radius",
"opacity"});
487 point_attributes_to_skip.
add(
"vertex_color");
506 const int num_old_points = curves.
points_num();
507 curves.resize(curves.points_num() + 1, curves.curves_num() + 1);
508 curves.offsets_for_write().last(1) = num_old_points;
526 curve_attributes_to_skip.
add(
"start_cap");
534 curve_attributes_to_skip.
add(
"end_cap");
537 const bool is_cyclic =
ELEM(ptd.
type, PrimitiveType::Box, PrimitiveType::Circle);
540 softness.span.last() = ptd.
softness;
544 attributes.lookup_or_add_for_write_span<
float>(
550 curve_attributes_to_skip.
add(
"fill_opacity");
555 curve_attributes_to_skip.
add(
"fill_color");
561 curve_attributes_to_skip.
add_multiple({
"material_index",
"cyclic",
"softness"});
564 curves.update_curve_types();
565 curve_attributes_to_skip.
add(
"curve_type");
571 curves.curves_range().take_back(1));
590 case PrimitiveType::Line: {
591 header +=
RPT_(
"Line: ");
594 case (PrimitiveType::Polyline): {
595 header +=
RPT_(
"Polyline: ");
598 case (PrimitiveType::Box): {
599 header +=
RPT_(
"Rectangle: ");
602 case (PrimitiveType::Circle): {
603 header +=
RPT_(
"Circle: ");
606 case (PrimitiveType::Arc): {
607 header +=
RPT_(
"Arc: ");
610 case (PrimitiveType::Curve): {
611 header +=
RPT_(
"Curve: ");
620 header += fmt::format(
IFACE_(
"{}: confirm, {}: cancel, {}: panning, Shift: align"),
625 header += fmt::format(
IFACE_(
", {}/{}: adjust subdivisions: {}"),
631 header +=
IFACE_(
", Alt: center");
636 PrimitiveType::Polyline,
638 PrimitiveType::Curve))
643 header += fmt::format(
IFACE_(
", {}: grab, {}: rotate, {}: scale"),
695 *vc.
scene, *vc.
region, *view3d, *vc.
obact, grease_pencil->get_active_layer());
754 if (use_vertex_color) {
759 std::make_optional(color_base) :
762 std::make_optional(color_base) :
776 BLI_assert(grease_pencil->has_active_layer());
777 ptd.
local_transform = grease_pencil->get_active_layer()->local_transform();
778 ptd.
drawing = grease_pencil->get_editable_drawing_at(*grease_pencil->get_active_layer(),
813 MEM_delete<PrimitiveToolOperation>(ptd);
820 using namespace math;
821 return sign(p) *
float2(1.0f / numbers::sqrt2) *
length(p);
827 using namespace math;
828 return sign(p) *
float2(std::max(
abs(p[0]),
abs(p[1])));
834 using namespace math;
836 const float sin225 = 0.3826834323650897717284599840304f;
843 using namespace math;
847 const float2 dif = end - start;
851 if (ptd.
type == PrimitiveType::Box) {
854 else if (ptd.
type == PrimitiveType::Circle) {
863 float2 center = start + offset;
874 for (
const int i :
IndexRange(number_control_points + 1)) {
876 end_pos, start_pos, (i /
float(number_control_points)));
885 const float2 dif = end - start;
901 if (!
ELEM(ptd.
type, PrimitiveType::Circle, PrimitiveType::Box)) {
921 (other_point_2d +
float2(event->
mval)) / 2.0f);
929 const float2 dif = end - start;
940 if (
ELEM(ptd.
type, PrimitiveType::Box, PrimitiveType::Circle)) {
949 return center_of_mass;
960 const float2 end_ = end - center_of_mass;
961 const float2 start_ = start - center_of_mass;
967 const float2 dif = start_pos2 - center_of_mass;
971 const float2 pos2 =
rot * dif + center_of_mass;
990 const float2 pos2 = (start_pos2 - center_of_mass) * scale + center_of_mass;
998 float closest_distance_squared = std::numeric_limits<float>::max();
999 int closest_point = -1;
1007 if (distance_squared <= radius_sq) {
1014 if (distance_squared < closest_distance_squared &&
1018 closest_point =
point;
1019 closest_distance_squared = distance_squared;
1023 if (closest_point != -1) {
1024 return closest_point;
1044 if (ptd.
type == PrimitiveType::Polyline) {
1062 switch (event->
val) {
1076 ELEM(ptd.
type, PrimitiveType::Line, PrimitiveType::Arc, PrimitiveType::Curve))
1092 if (ptd.
type == PrimitiveType::Polyline &&
1183 if (ptd.
type != PrimitiveType::Polyline) {
1308 switch (event->
type) {
1357 const int default_subdiv,
1361 {
int(PrimitiveType::Box),
"BOX", 0,
"Box",
""},
1362 {
int(PrimitiveType::Line),
"LINE", 0,
"Line",
""},
1363 {
int(PrimitiveType::Polyline),
"POLYLINE", 0,
"Polyline",
""},
1364 {
int(PrimitiveType::Circle),
"CIRCLE", 0,
"Circle",
""},
1365 {
int(PrimitiveType::Arc),
"ARC", 0,
"Arc",
""},
1366 {
int(PrimitiveType::Curve),
"CURVE", 0,
"Curve",
""},
1367 {0,
nullptr, 0,
nullptr,
nullptr},
1378 "Number of subdivisions per segment",
1384 ot->
srna,
"type", grease_pencil_primitive_type,
int(default_type),
"Type",
"Type of shape");
1390 ot->
name =
"Grease Pencil Line Shape";
1391 ot->
idname =
"GREASE_PENCIL_OT_primitive_line";
1392 ot->
description =
"Create predefined grease pencil stroke lines";
1409 ot->
name =
"Grease Pencil Polyline Shape";
1410 ot->
idname =
"GREASE_PENCIL_OT_primitive_polyline";
1411 ot->
description =
"Create predefined grease pencil stroke polylines";
1428 ot->
name =
"Grease Pencil Arc Shape";
1429 ot->
idname =
"GREASE_PENCIL_OT_primitive_arc";
1430 ot->
description =
"Create predefined grease pencil stroke arcs";
1447 ot->
name =
"Grease Pencil Curve Shape";
1448 ot->
idname =
"GREASE_PENCIL_OT_primitive_curve";
1449 ot->
description =
"Create predefined grease pencil stroke curve shapes";
1466 ot->
name =
"Grease Pencil Box Shape";
1467 ot->
idname =
"GREASE_PENCIL_OT_primitive_box";
1468 ot->
description =
"Create predefined grease pencil stroke boxes";
1485 ot->
name =
"Grease Pencil Circle Shape";
1486 ot->
idname =
"GREASE_PENCIL_OT_primitive_circle";
1487 ot->
description =
"Create predefined grease pencil stroke circles";
1518 {
int(ModalKeyMode::Cancel),
"CANCEL", 0,
"Cancel",
""},
1519 {
int(ModalKeyMode::Confirm),
"CONFIRM", 0,
"Confirm",
""},
1520 {
int(ModalKeyMode::Panning),
"PANNING", 0,
"Panning",
""},
1521 {
int(ModalKeyMode::Extrude),
"EXTRUDE", 0,
"Extrude",
""},
1522 {
int(ModalKeyMode::Grab),
"GRAB", 0,
"Grab",
""},
1523 {
int(ModalKeyMode::Rotate),
"ROTATE", 0,
"Rotate",
""},
1524 {
int(ModalKeyMode::Scale),
"SCALE", 0,
"Scale",
""},
1525 {
int(ModalKeyMode::IncreaseSubdivision),
1526 "INCREASE_SUBDIVISION",
1528 "Increase Subdivision",
1530 {
int(ModalKeyMode::DecreaseSubdivision),
1531 "DECREASE_SUBDIVISION",
1533 "Decrease Subdivision",
1535 {0,
nullptr, 0,
nullptr,
nullptr},
void BKE_brush_init_gpencil_settings(Brush *brush)
wmWindow * CTX_wm_window(const bContext *C)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
Main * CTX_data_main(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
Low-level operations for curves.
Low-level operations for grease pencil.
Material * BKE_grease_pencil_object_material_ensure_from_active_input_brush(Main *bmain, Object *ob, Brush *brush)
General operations, lookup, etc. for materials.
int BKE_object_material_index_get(Object *ob, const Material *ma)
Brush * BKE_paint_brush(Paint *paint)
#define BLI_assert_unreachable()
void srgb_to_linearrgb_v3_v3(float linear[3], const float srgb[3])
void DEG_id_tag_update(ID *id, unsigned int flags)
@ GP_STROKE_CAP_TYPE_ROUND
@ GP_SCULPT_SETT_FLAG_PRIMITIVE_CURVE
@ GPPAINT_FLAG_USE_VERTEXCOLOR
@ OP_IS_MODAL_CURSOR_REGION
void ED_workspace_status_text(bContext *C, const char *str)
void ED_region_tag_redraw(ARegion *region)
void * ED_region_draw_cb_activate(ARegionType *art, void(*draw)(const bContext *, ARegion *, void *), void *customdata, int type)
#define REGION_DRAW_POST_VIEW
bool ED_region_draw_cb_exit(ARegionType *art, void *handle)
blender::float2 ED_view3d_project_float_v2_m4(const ARegion *region, const float co[3], const blender::float4x4 &mat)
ViewContext ED_view3d_viewcontext_init(bContext *C, Depsgraph *depsgraph)
void ED_view3d_navigation_free(bContext *C, ViewOpsData *vod)
blender::float4x4 ED_view3d_ob_project_mat_get(const RegionView3D *rv3d, const Object *ob)
bool ED_view3d_navigation_do(bContext *C, ViewOpsData *vod, const wmEvent *event, const float depth_loc_override[3])
ViewOpsData * ED_view3d_navigation_init(bContext *C, const wmKeyMapItem *kmi_merge)
@ GPU_SHADER_3D_POINT_VARYING_SIZE_VARYING_COLOR
void GPU_program_point_size(bool enable)
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a point
void UI_GetThemeColor4fv(int colorid, float col[4])
SIMD_FORCE_INLINE btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
SIMD_FORCE_INLINE btScalar length() const
Return the length of the vector.
constexpr IndexRange drop_back(int64_t n) const
static constexpr IndexRange from_single(const int64_t index)
constexpr IndexRange index_range() const
constexpr int64_t size() const
constexpr MutableSpan slice(const int64_t start, const int64_t size) const
constexpr void fill(const T &value) const
constexpr IndexRange index_range() const
constexpr T & last(const int64_t n=0) const
void add_multiple(Span< Key > keys)
constexpr const T & last(const int64_t n=0) const
OffsetIndices< int > points_by_curve() const
void remove_curves(const IndexMask &curves_to_delete, const AttributeFilter &attribute_filter)
MutableSpan< float > opacities_for_write()
MutableSpan< float > radii_for_write()
bke::CurvesGeometry & strokes_for_write()
void tag_topology_changed()
MutableSpan< ColorGeometry4f > fill_colors_for_write()
MutableSpan< ColorGeometry4f > vertex_colors_for_write()
void set_texture_matrices(Span< float4x2 > matrices, const IndexMask &selection)
bool use_project_to_surface() const
void set_origin_to_nearest_stroke(float2 co)
void cache_viewport_depths(Depsgraph *depsgraph, ARegion *region, View3D *view3d)
float3 project(float2 co) const
bool use_project_to_nearest_stroke() const
float4x4 to_world_space() const
static bool is_cyclic(const Nurb *nu)
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void ED_primitivetool_modal_keymap(wmKeyConfig *keyconf)
void ED_operatortypes_grease_pencil_primitives()
void copy(const GVArray &src, GMutableSpan dst, int64_t grain_size=4096)
auto attribute_filter_from_skip_ref(const Span< StringRef > skip)
void fill_attribute_range_default(MutableAttributeAccessor dst_attributes, AttrDomain domain, const AttributeFilter &attribute_filter, IndexRange range)
static constexpr int control_point_center
int grease_pencil_draw_operator_invoke(bContext *C, wmOperator *op, const bool use_duplicate_previous_key)
static int control_points_per_segment(const PrimitiveToolOperation &ptd)
static constexpr float ui_tertiary_point_draw_size_px
static void grease_pencil_primitive_cancel(bContext *C, wmOperator *op)
static void grease_pencil_primitive_grab_update(PrimitiveToolOperation &ptd, const wmEvent *event)
static void grease_pencil_primitive_operator_update(PrimitiveToolOperation &ptd, const wmEvent *event)
static int grease_pencil_primitive_mouse_event(PrimitiveToolOperation &ptd, const wmEvent *event)
static void GREASE_PENCIL_OT_primitive_circle(wmOperatorType *ot)
static float2 snap_diagonals_box(float2 p)
static constexpr int control_point_first
static float2 snap_8_angles(float2 p)
float opacity_from_input_sample(const float pressure, const Brush *brush, const BrushGpencilSettings *settings)
static void grease_pencil_primitive_drag_update(PrimitiveToolOperation &ptd, const wmEvent *event)
static int grease_pencil_primitive_invoke(bContext *C, wmOperator *op, const wmEvent *event)
float radius_from_input_sample(const RegionView3D *rv3d, const ARegion *region, const Brush *brush, const float pressure, const float3 location, const float4x4 to_world, const BrushGpencilSettings *settings)
static int grease_pencil_primitive_modal(bContext *C, wmOperator *op, const wmEvent *event)
static void primitive_calulate_curve_positions(PrimitiveToolOperation &ptd, Span< float2 > control_points, MutableSpan< float2 > new_positions)
static void control_point_colors_and_sizes(const PrimitiveToolOperation &ptd, MutableSpan< ColorGeometry4f > colors, MutableSpan< float > sizes)
static void grease_pencil_primitive_extruding_update(PrimitiveToolOperation &ptd, const wmEvent *event)
static int grease_pencil_primitive_curve_points_number(PrimitiveToolOperation &ptd)
static void grease_pencil_primitive_update_view(bContext *C, PrimitiveToolOperation &ptd)
static int grease_pencil_primitive_event_modal_map(bContext *C, wmOperator *op, PrimitiveToolOperation &ptd, const wmEvent *event)
static void grease_pencil_primitive_draw(const bContext *, ARegion *, void *arg)
static void draw_control_points(PrimitiveToolOperation &ptd)
static void grease_pencil_primitive_update_curves(PrimitiveToolOperation &ptd)
static float2 primitive_center_of_mass(const PrimitiveToolOperation &ptd)
static void grease_pencil_primitive_drag_all_update(PrimitiveToolOperation &ptd, const wmEvent *event)
static constexpr float ui_secondary_point_draw_size_px
static constexpr float ui_point_hit_size_px
static constexpr int control_point_last
static constexpr float ui_point_max_hit_size_px
static void grease_pencil_primitive_init_curves(PrimitiveToolOperation &ptd)
static void grease_pencil_primitive_undo_curves(PrimitiveToolOperation &ptd)
static void GREASE_PENCIL_OT_primitive_line(wmOperatorType *ot)
static void grease_pencil_primitive_scale_all_update(PrimitiveToolOperation &ptd, const wmEvent *event)
static void primitive_calulate_curve_positions_2d(PrimitiveToolOperation &ptd, MutableSpan< float2 > new_positions)
static ControlPointType get_control_point_type(const PrimitiveToolOperation &ptd, const int point)
static constexpr float ui_primary_point_draw_size_px
static void grease_pencil_primitive_common_props(wmOperatorType *ot, const int default_subdiv, const PrimitiveType default_type)
static void grease_pencil_primitive_rotate_all_update(PrimitiveToolOperation &ptd, const wmEvent *event)
float4x2 calculate_texture_space(const Scene *scene, const ARegion *region, const float2 &mouse, const DrawingPlacement &placement)
static void grease_pencil_primitive_cursor_update(bContext *C, PrimitiveToolOperation &ptd, const wmEvent *event)
static void grease_pencil_primitive_load(PrimitiveToolOperation &ptd)
static void grease_pencil_primitive_status_indicators(bContext *C, wmOperator *op, PrimitiveToolOperation &ptd)
static void grease_pencil_primitive_exit(bContext *C, wmOperator *op)
static void GREASE_PENCIL_OT_primitive_polyline(wmOperatorType *ot)
static void GREASE_PENCIL_OT_primitive_curve(wmOperatorType *ot)
static float2 primitive_local_to_screen(const PrimitiveToolOperation &ptd, const float3 &point)
static void grease_pencil_primitive_save(PrimitiveToolOperation &ptd)
static float2 snap_diagonals(float2 p)
static void GREASE_PENCIL_OT_primitive_box(wmOperatorType *ot)
static void GREASE_PENCIL_OT_primitive_arc(wmOperatorType *ot)
static int primitive_check_ui_hover(const PrimitiveToolOperation &ptd, const wmEvent *event)
T cos(const AngleRadianBase< T > &a)
T length(const VecBase< T, Size > &a)
T interpolate(const T &a, const T &b, const FactorT &t)
T atan2(const T &y, const T &x)
T distance_squared(const VecBase< T, Size > &a, const VecBase< T, Size > &b)
T sin(const AngleRadianBase< T > &a)
T mod(const T &a, const T &b)
VecBase< T, 3 > transform_point(const CartesianBasis &basis, const VecBase< T, 3 > &v)
MatBase< float, 2, 2 > float2x2
VecBase< float, 2 > float2
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
int RNA_int_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
struct ARegionType * type
struct CurveMapping * curve_sensitivity
struct CurveMapping * curve_strength
struct CurveMapping * curve_jitter
struct CurveMapping * curve_rand_pressure
struct CurveMapping * curve_rand_strength
struct CurveMapping * curve_rand_saturation
struct CurveMapping * curve_rand_hue
struct CurveMapping * curve_rand_uv
struct CurveMapping * curve_rand_value
struct BrushGpencilSettings * gpencil_settings
struct CurveMapping * cur_primitive
struct ToolSettings * toolsettings
MutableVArraySpan< T > span
int(* modal)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
void(* cancel)(bContext *C, wmOperator *op)
struct wmOperatorType * type
ccl_device_inline int abs(int x)
void WM_cursor_modal_set(wmWindow *win, int val)
void WM_cursor_modal_restore(wmWindow *win)
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
std::optional< std::string > WM_modalkeymap_operator_items_to_string(wmOperatorType *ot, const int propvalue, const bool compact)
wmKeyMap * WM_modalkeymap_ensure(wmKeyConfig *keyconf, const char *idname, const EnumPropertyItem *items)
void WM_modalkeymap_assign(wmKeyMap *km, const char *opname)
wmKeyMap * WM_modalkeymap_find(wmKeyConfig *keyconf, const char *idname)
void WM_operatortype_append(void(*opfunc)(wmOperatorType *))