Blender V4.3
transform_constraints.cc File Reference
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_view3d_types.h"
#include "GPU_immediate.hh"
#include "GPU_matrix.hh"
#include "GPU_state.hh"
#include "BLI_math_matrix.h"
#include "BLI_math_rotation.h"
#include "BLI_rect.h"
#include "BLI_string.h"
#include "BLI_utildefines.h"
#include "ED_view3d.hh"
#include "BLT_translation.hh"
#include "UI_resources.hh"
#include "UI_view2d.hh"
#include "transform.hh"
#include "transform_gizmo.hh"
#include "transform_orientations.hh"
#include "transform_snap.hh"
#include "transform_constraints.hh"

Go to the source code of this file.

Functions

Drawing Constraints
static void drawObjectConstraint (TransInfo *t)
 
static void drawLine (TransInfo *t, const float center[3], const float dir[3], char axis, short options)
 
void drawConstraint (TransInfo *t)
 
void drawPropCircle (TransInfo *t)
 
void drawPropRange (TransInfo *t)
 
Internal Setup Calls
void setConstraint (TransInfo *t, int mode, const char text[])
 
void setAxisMatrixConstraint (TransInfo *t, int mode, const char text[])
 
void setLocalConstraint (TransInfo *t, int mode, const char text[])
 
void setUserConstraint (TransInfo *t, int mode, const char text_[])
 
Start / Stop Constraints
void startConstraint (TransInfo *t)
 
void stopConstraint (TransInfo *t)
 
Middle Mouse Button Select
void initSelectConstraint (TransInfo *t)
 
void selectConstraint (TransInfo *t)
 
void postSelectConstraint (TransInfo *t)
 
static void setNearestAxis2d (TransInfo *t)
 
static void setNearestAxis3d (TransInfo *t)
 
void setNearestAxis (TransInfo *t)
 
Helper Functions
int constraintModeToIndex (const TransInfo *t)
 
bool isLockConstraint (const TransInfo *t)
 
int getConstraintSpaceDimension (const TransInfo *t)
 

Internal Utilities

#define CONSTRAIN_EPSILON   0.0001f
 
static void projection_matrix_calc (const TransInfo *t, float r_pmtx[3][3])
 
static void view_vector_calc (const TransInfo *t, const float focus[3], float r_vec[3])
 
static void constraint_plane_normal_calc (const TransInfo *t, float r_plane_no[3])
 
void constraintNumInput (TransInfo *t, float vec[3])
 
static void viewAxisCorrectCenter (const TransInfo *t, float t_con_center[3])
 
static void axisProjection (const TransInfo *t, const float axis[3], const float in[3], float out[3])
 
static void constraint_snap_plane_to_edge (const TransInfo *t, const float plane_no[3], float r_out[3])
 
static void UNUSED_FUNCTION (constraint_snap_plane_to_face(const TransInfo *t, const float plane[4], float r_out[3]))
 
void transform_constraint_snap_axis_to_edge (const TransInfo *t, const float axis[3], float r_out[3])
 
void transform_constraint_snap_axis_to_face (const TransInfo *t, const float axis[3], float r_out[3])
 
static bool isPlaneProjectionViewAligned (const TransInfo *t, const float plane_no[3])
 
static void planeProjection (const TransInfo *t, const float plane_no[3], const float in[3], float out[3])
 
static short transform_orientation_or_default (const TransInfo *t)
 
static const float(* transform_object_axismtx_get (const TransInfo *t, const TransDataContainer *, const TransData *td))[3]
 
void transform_constraint_get_nearest (const TransInfo *t, const float3 &vec, float r_vec[3])
 
static void applyAxisConstraintVec (const TransInfo *t, const TransDataContainer *, const TransData *td, const float in[3], float out[3])
 
static void applyObjectConstraintVec (const TransInfo *t, const TransDataContainer *tc, const TransData *td, const float in[3], float out[3])
 
static void applyAxisConstraintSize (const TransInfo *t, const TransDataContainer *, const TransData *td, float r_smat[3][3])
 
static void applyObjectConstraintSize (const TransInfo *t, const TransDataContainer *tc, const TransData *td, float r_smat[3][3])
 
static void constraints_rotation_impl (const TransInfo *t, const float axismtx[3][3], float r_axis[3], float *r_angle)
 
static void applyAxisConstraintRot (const TransInfo *t, const TransDataContainer *, const TransData *td, float r_axis[3], float *r_angle)
 
static void applyObjectConstraintRot (const TransInfo *t, const TransDataContainer *tc, const TransData *td, float r_axis[3], float *r_angle)
 

Macro Definition Documentation

◆ CONSTRAIN_EPSILON

Function Documentation

◆ applyAxisConstraintRot()

static void applyAxisConstraintRot ( const TransInfo * t,
const TransDataContainer * ,
const TransData * td,
float r_axis[3],
float * r_angle )
static

Generic callback for constant spatial constraints applied to rotations

The rotation axis is copied into vec.

In the case of single axis constraints, the rotation axis is directly the one constrained to. For planar constraints (2 axis), the rotation axis is the normal of the plane.

The following only applies when CON_NOFLIP is not set. The vector is then modified to always point away from the screen (in global space) This insures that the rotation is always logically following the mouse. (ie: not doing counterclockwise rotations when the mouse moves clockwise).

Definition at line 612 of file transform_constraints.cc.

References TransInfo::con, CON_APPLY, constraints_rotation_impl(), TransCon::mode, and TransInfo::spacemtx.

Referenced by setConstraint().

◆ applyAxisConstraintSize()

static void applyAxisConstraintSize ( const TransInfo * t,
const TransDataContainer * ,
const TransData * td,
float r_smat[3][3] )
static

Generic callback for constant spatial constraints applied to resize motion.

Definition at line 509 of file transform_constraints.cc.

References TransInfo::con, CON_APPLY, CON_AXIS0, CON_AXIS1, CON_AXIS2, TransCon::mode, mul_m3_m3m3(), TransInfo::spacemtx, and TransInfo::spacemtx_inv.

Referenced by setConstraint().

◆ applyAxisConstraintVec()

static void applyAxisConstraintVec ( const TransInfo * t,
const TransDataContainer * ,
const TransData * td,
const float in[3],
float out[3] )
static

Generic callback for constant spatial constraints applied to linear motion

The in vector in projected into the constrained space and then further projected along the view vector. (in perspective mode, the view vector is relative to the position on screen)

Definition at line 459 of file transform_constraints.cc.

References TransInfo::con, CON_APPLY, copy_v3_v3(), TransCon::mode, and transform_constraint_get_nearest().

Referenced by applyObjectConstraintVec(), and setConstraint().

◆ applyObjectConstraintRot()

static void applyObjectConstraintRot ( const TransInfo * t,
const TransDataContainer * tc,
const TransData * td,
float r_axis[3],
float * r_angle )
static

Callback for object based spatial constraints applied to rotations

The rotation axis is copied into vec.

In the case of single axis constraints, the rotation axis is directly the one constrained to. For planar constraints (2 axis), the rotation axis is the normal of the plane.

The following only applies when CON_NOFLIP is not set. The vector is then modified to always point away from the screen (in global space) This insures that the rotation is always logically following the mouse. (ie: not doing counterclockwise rotations when the mouse moves clockwise).

Definition at line 636 of file transform_constraints.cc.

References TransData::axismtx, BLI_assert, TransInfo::con, CON_APPLY, constraints_rotation_impl(), TransDataContainer::data, TransInfo::flag, float, TransDataContainer::mat3_unit, TransCon::mode, mul_m3_m3m3(), T_EDIT, TRANS_DATA_CONTAINER_FIRST_OK, and transform_object_axismtx_get().

Referenced by setAxisMatrixConstraint().

◆ applyObjectConstraintSize()

static void applyObjectConstraintSize ( const TransInfo * t,
const TransDataContainer * tc,
const TransData * td,
float r_smat[3][3] )
static

Callback for object based spatial constraints applied to resize motion.

Definition at line 535 of file transform_constraints.cc.

References TransInfo::con, CON_APPLY, CON_AXIS0, CON_AXIS1, CON_AXIS2, TransInfo::flag, float, invert_m3_m3(), TransDataContainer::mat3_unit, TransCon::mode, mul_m3_m3m3(), T_EDIT, and transform_object_axismtx_get().

Referenced by setAxisMatrixConstraint().

◆ applyObjectConstraintVec()

static void applyObjectConstraintVec ( const TransInfo * t,
const TransDataContainer * tc,
const TransData * td,
const float in[3],
float out[3] )
static

Generic callback for object based spatial constraints applied to linear motion

At first, the following is applied without orientation The IN vector in projected into the constrained space and then further projected along the view vector. (in perspective mode, the view vector is relative to the position on screen).

Further down, that vector is mapped to each data's space.

Definition at line 483 of file transform_constraints.cc.

References applyAxisConstraintVec(), TransInfo::con, CON_APPLY, copy_v3_v3(), TransInfo::flag, float, TransDataContainer::mat3_unit, TransCon::mode, mul_m3_v3(), TransInfo::spacemtx_inv, T_EDIT, and transform_object_axismtx_get().

Referenced by setAxisMatrixConstraint().

◆ axisProjection()

static void axisProjection ( const TransInfo * t,
const float axis[3],
const float in[3],
float out[3] )
static

◆ constraint_plane_normal_calc()

static void constraint_plane_normal_calc ( const TransInfo * t,
float r_plane_no[3] )
static

◆ constraint_snap_plane_to_edge()

static void constraint_snap_plane_to_edge ( const TransInfo * t,
const float plane_no[3],
float r_out[3] )
static

Snap to the intersection between the edge direction and the constraint plane.

Definition at line 272 of file transform_constraints.cc.

References CONSTRAIN_EPSILON, dot_v3v3(), fabsf, isect_ray_plane_v3_factor(), madd_v3_v3v3fl(), TransSnap::snap_source, TransSnap::snap_target, TransSnap::snapNormal, sub_v3_v3(), and TransInfo::tsnap.

Referenced by transform_constraint_get_nearest().

◆ constraintModeToIndex()

int constraintModeToIndex ( const TransInfo * t)

Definition at line 1228 of file transform_constraints.cc.

References TransInfo::con, CON_APPLY, CON_AXIS0, CON_AXIS1, CON_AXIS2, and TransCon::mode.

Referenced by saveTransform().

◆ constraintNumInput()

◆ constraints_rotation_impl()

◆ drawConstraint()

◆ drawLine()

◆ drawObjectConstraint()

◆ drawPropCircle()

◆ drawPropRange()

◆ getConstraintSpaceDimension()

int getConstraintSpaceDimension ( const TransInfo * t)

Returns the dimension of the constraint space.

For that reason, the flags always needs to be set to properly evaluate here, even if they aren't actually used in the callback function. (Which could happen for weird constraints not yet designed. Along a path for example.)

Definition at line 1267 of file transform_constraints.cc.

References TransInfo::con, CON_AXIS0, CON_AXIS1, CON_AXIS2, and TransCon::mode.

Referenced by constraintNumInput(), startConstraint(), and transform_constraint_get_nearest().

◆ initSelectConstraint()

◆ isLockConstraint()

bool isLockConstraint ( const TransInfo * t)

Definition at line 1248 of file transform_constraints.cc.

References TransInfo::con, CON_AXIS0, CON_AXIS1, CON_AXIS2, and TransCon::mode.

Referenced by applyPushPull().

◆ isPlaneProjectionViewAligned()

static bool isPlaneProjectionViewAligned ( const TransInfo * t,
const float plane_no[3] )
static

Return true if the 2x axis are both aligned when projected into the view. In this case, we can't usefully project the cursor onto the plane.

Definition at line 337 of file transform_constraints.cc.

References TransInfo::center_global, dot_v3v3(), eps, fabsf, and view_vector_calc().

Referenced by transform_constraint_get_nearest().

◆ planeProjection()

static void planeProjection ( const TransInfo * t,
const float plane_no[3],
const float in[3],
float out[3] )
static

◆ postSelectConstraint()

void postSelectConstraint ( TransInfo * t)

Definition at line 1098 of file transform_constraints.cc.

References TransInfo::con, CON_AXIS0, CON_AXIS1, CON_AXIS2, and TransCon::mode.

Referenced by transformEvent().

◆ projection_matrix_calc()

static void projection_matrix_calc ( const TransInfo * t,
float r_pmtx[3][3] )
static

◆ selectConstraint()

void selectConstraint ( TransInfo * t)

◆ setAxisMatrixConstraint()

◆ setConstraint()

◆ setLocalConstraint()

void setLocalConstraint ( TransInfo * t,
int mode,
const char text[] )

◆ setNearestAxis()

◆ setNearestAxis2d()

static void setNearestAxis2d ( TransInfo * t)
static

◆ setNearestAxis3d()

◆ setUserConstraint()

void setUserConstraint ( TransInfo * t,
int mode,
const char text_[] )

◆ startConstraint()

◆ stopConstraint()

◆ transform_constraint_get_nearest()

◆ transform_constraint_snap_axis_to_edge()

void transform_constraint_snap_axis_to_edge ( const TransInfo * t,
const float axis[3],
float r_out[3] )

◆ transform_constraint_snap_axis_to_face()

void transform_constraint_snap_axis_to_face ( const TransInfo * t,
const float axis[3],
float r_out[3] )

◆ transform_object_axismtx_get()

static const float(* transform_object_axismtx_get ( const TransInfo * t,
const TransDataContainer * ,
const TransData * td ))[3]
static

◆ transform_orientation_or_default()

static short transform_orientation_or_default ( const TransInfo * t)
static

◆ UNUSED_FUNCTION()

static void UNUSED_FUNCTION ( constraint_snap_plane_to_face(const TransInfo *t, const float plane[4], float r_out[3]) )
static

◆ view_vector_calc()

static void view_vector_calc ( const TransInfo * t,
const float focus[3],
float r_vec[3] )
static

◆ viewAxisCorrectCenter()

static void viewAxisCorrectCenter ( const TransInfo * t,
float t_con_center[3] )
static