tornavis/source/blender/editors/include/ED_transform.hh

219 lines
7.3 KiB
C++

/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup editors
*/
#pragma once
#include "BLI_sys_types.h"
/* ******************* Registration Function ********************** */
struct ARegion;
struct bContext;
struct Scene;
struct ReportList;
struct TransformOrientation;
struct Object;
struct RegionView3D;
struct View3D;
struct ViewLayer;
struct wmGizmoGroupType;
struct wmKeyConfig;
struct wmOperatorType;
void ED_keymap_transform(wmKeyConfig *keyconf);
void transform_operatortypes();
/* ******************** Macros & Prototypes *********************** */
/* MODE AND NUMINPUT FLAGS */
enum eTfmMode {
TFM_INIT = -1,
TFM_DUMMY,
TFM_TRANSLATION,
TFM_ROTATION,
TFM_RESIZE,
TFM_SKIN_RESIZE,
TFM_TOSPHERE,
TFM_SHEAR,
TFM_BEND,
TFM_SHRINKFATTEN,
TFM_TILT,
TFM_TRACKBALL,
TFM_PUSHPULL,
TFM_EDGE_CREASE,
TFM_VERT_CREASE,
TFM_MIRROR,
TFM_BONESIZE,
TFM_BONE_ENVELOPE,
TFM_CURVE_SHRINKFATTEN,
TFM_MASK_SHRINKFATTEN,
TFM_GPENCIL_SHRINKFATTEN,
TFM_BONE_ROLL,
TFM_TIME_TRANSLATE,
TFM_TIME_SLIDE,
TFM_TIME_SCALE,
TFM_TIME_EXTEND,
/* TFM_TIME_DUPLICATE (deprecated). */
TFM_BAKE_TIME = 26,
TFM_DEPRECATED, /* was BEVEL */
TFM_BWEIGHT,
TFM_ALIGN,
TFM_EDGE_SLIDE,
TFM_VERT_SLIDE,
TFM_SEQ_SLIDE,
TFM_BONE_ENVELOPE_DIST,
TFM_NORMAL_ROTATION,
TFM_GPENCIL_OPACITY,
};
/* Standalone call to get the transformation center corresponding to the current situation
* returns 1 if successful, 0 otherwise (usually means there's no selection)
* (if false is returns, `cent3d` is unmodified). */
bool calculateTransformCenter(bContext *C, int centerMode, float cent3d[3], float cent2d[2]);
/* UNUSED */
// int BIF_snappingSupported(Object *obedit);
void BIF_clearTransformOrientation(bContext *C);
void BIF_removeTransformOrientation(bContext *C, TransformOrientation *target);
void BIF_removeTransformOrientationIndex(bContext *C, int index);
bool BIF_createTransformOrientation(bContext *C,
ReportList *reports,
const char *name,
bool use_view,
bool activate,
bool overwrite);
void BIF_selectTransformOrientation(bContext *C, TransformOrientation *target);
void ED_getTransformOrientationMatrix(const Scene *scene,
ViewLayer *view_layer,
const View3D *v3d,
Object *ob,
Object *obedit,
short around,
float r_orientation_mat[3][3]);
int BIF_countTransformOrientation(const bContext *C);
/* to be able to add operator properties to other operators */
#define P_MIRROR (1 << 0)
#define P_MIRROR_DUMMY (P_MIRROR | (1 << 1))
#define P_PROPORTIONAL (1 << 2)
#define P_ORIENT_AXIS (1 << 3)
#define P_ORIENT_AXIS_ORTHO (1 << 4)
#define P_ORIENT_MATRIX (1 << 5)
#define P_SNAP (1 << 6)
#define P_GEO_SNAP (P_SNAP | (1 << 7))
#define P_ALIGN_SNAP (P_GEO_SNAP | (1 << 8))
#define P_CONSTRAINT (1 << 9)
#define P_OPTIONS (1 << 10)
#define P_CORRECT_UV (1 << 11)
#define P_NO_DEFAULTS (1 << 12)
#define P_NO_TEXSPACE (1 << 13)
#define P_CENTER (1 << 14)
#define P_GPENCIL_EDIT (1 << 15)
#define P_CURSOR_EDIT (1 << 16)
#define P_CLNOR_INVALIDATE (1 << 17)
#define P_VIEW2D_EDGE_PAN (1 << 18)
/* For properties performed when confirming the transformation. */
#define P_POST_TRANSFORM (1 << 19)
void Transform_Properties(wmOperatorType *ot, int flags);
/* `transform_orientations.cc` */
void ED_transform_calc_orientation_from_type(const bContext *C, float r_mat[3][3]);
/**
* \note The resulting matrix may not be orthogonal,
* callers that depend on `r_mat` to be orthogonal should use #orthogonalize_m3.
*
* A non orthogonal matrix may be returned when:
* - #V3D_ORIENT_GIMBAL the result won't be orthogonal unless the object has no rotation.
* - #V3D_ORIENT_LOCAL may contain shear from non-uniform scale in parent/child relationships.
* - #V3D_ORIENT_CUSTOM may have been created from #V3D_ORIENT_LOCAL.
*/
short ED_transform_calc_orientation_from_type_ex(const Scene *scene,
ViewLayer *view_layer,
const View3D *v3d,
const RegionView3D *rv3d,
Object *ob,
Object *obedit,
short orientation_index,
int pivot_point,
float r_mat[3][3]);
bool ED_transform_calc_pivot_pos(const bContext *C, const short pivot_type, float r_pivot_pos[3]);
/* transform gizmos */
void VIEW3D_GGT_xform_gizmo(wmGizmoGroupType *gzgt);
/**
* Only poll, flag & gzmap_params differ.
*/
void VIEW3D_GGT_xform_gizmo_context(wmGizmoGroupType *gzgt);
void VIEW3D_GGT_xform_cage(wmGizmoGroupType *gzgt);
void VIEW3D_GGT_xform_shear(wmGizmoGroupType *gzgt);
/* `transform_gizmo_extrude_3d.cc` */
void VIEW3D_GGT_xform_extrude(wmGizmoGroupType *gzgt);
/* Generic 2D transform gizmo callback assignment. */
void ED_widgetgroup_gizmo2d_xform_callbacks_set(wmGizmoGroupType *gzgt);
void ED_widgetgroup_gizmo2d_xform_no_cage_callbacks_set(wmGizmoGroupType *gzgt);
void ED_widgetgroup_gizmo2d_resize_callbacks_set(wmGizmoGroupType *gzgt);
void ED_widgetgroup_gizmo2d_rotate_callbacks_set(wmGizmoGroupType *gzgt);
#define SNAP_INCREMENTAL_ANGLE DEG2RAD(5.0)
struct TransformBounds {
float center[3]; /* Center for transform widget. */
float min[3], max[3]; /* Bounding-box of selection for transform widget. */
/* Normalized axis */
float axis[3][3];
float axis_min[3], axis_max[3];
/**
* When #TransformCalcParams.use_local_axis is used.
* This is the local space matrix the caller may need to access.
*/
bool use_matrix_space;
float matrix_space[4][4];
};
struct TransformCalcParams {
uint use_only_center : 1;
uint use_local_axis : 1;
/* Use 'Scene.orientation_type' when zero, otherwise subtract one and use. */
ushort orientation_index;
};
/**
* Centroid, bound-box, of selection.
*
* Returns total items selected.
*/
int ED_transform_calc_gizmo_stats(const bContext *C,
const TransformCalcParams *params,
TransformBounds *tbounds,
RegionView3D *rv3d);
/**
* Iterates over all the strips and finds the closest snapping candidate of either \a frame_1 or \a
* frame_2. The closest snapping candidate will be the closest start or end frame of an existing
* strip.
* \returns True if there was anything to snap to.
*/
bool ED_transform_snap_sequencer_to_closest_strip_calc(Scene *scene,
ARegion *region,
int frame_1,
int frame_2,
int *r_snap_distance,
float *r_snap_frame);
void ED_draw_sequencer_snap_point(struct ARegion *region, float snap_point);