Blender  V3.3
transform_snap_animation.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2001-2002 NaN Holding BV. All rights reserved. */
3 
8 #include "DNA_anim_types.h"
9 
10 #include "BLI_math.h"
11 
12 #include "BKE_context.h"
13 #include "BKE_nla.h"
14 
15 #include "ED_markers.h"
16 #include "ED_screen.h"
17 
18 #include "transform.h"
19 #include "transform_snap.h"
20 
21 /* -------------------------------------------------------------------- */
26 {
27  short autosnap = SACTSNAP_OFF;
28 
29  if (t->spacetype == SPACE_ACTION) {
30  SpaceAction *saction = (SpaceAction *)t->area->spacedata.first;
31 
32  if (saction) {
33  autosnap = saction->autosnap;
34  }
35  }
36  else if (t->spacetype == SPACE_GRAPH) {
37  if ((t->mode == TFM_TRANSLATION) && activeSnap(t)) {
38  return autosnap;
39  }
40  SpaceGraph *sipo = (SpaceGraph *)t->area->spacedata.first;
41  if (sipo) {
42  autosnap = sipo->autosnap;
43  }
44  }
45  else if (t->spacetype == SPACE_NLA) {
46  SpaceNla *snla = (SpaceNla *)t->area->spacedata.first;
47 
48  if (snla) {
49  autosnap = snla->autosnap;
50  }
51  }
52  else {
53  autosnap = SACTSNAP_OFF;
54  }
55 
56  /* toggle autosnap on/off
57  * - when toggling on, prefer nearest frame over 1.0 frame increments
58  */
59  if (t->modifiers & MOD_SNAP_INVERT) {
60  if (autosnap) {
61  autosnap = SACTSNAP_OFF;
62  }
63  else {
64  autosnap = SACTSNAP_FRAME;
65  }
66  }
67 
68  return autosnap;
69 }
70 
72  const eAnimEdit_AutoSnap autosnap,
73  const float val_initial,
74  const float val_final,
75  float *r_val_final)
76 {
77  float deltax = val_final - val_initial;
78  switch (autosnap) {
79  case SACTSNAP_FRAME:
80  *r_val_final = floorf(val_final + 0.5f);
81  break;
82  case SACTSNAP_MARKER:
83  /* Snap to nearest marker. */
84  /* TODO: need some more careful checks for where data comes from. */
85  *r_val_final = (float)ED_markers_find_nearest_marker_time(&t->scene->markers, val_final);
86  break;
87  case SACTSNAP_SECOND:
88  case SACTSNAP_TSTEP: {
89  const Scene *scene = t->scene;
90  const double secf = FPS;
91  if (autosnap == SACTSNAP_SECOND) {
92  *r_val_final = floorf((val_final / secf) + 0.5) * secf;
93  }
94  else {
95  deltax = (float)(floor((deltax / secf) + 0.5) * secf);
96  *r_val_final = val_initial + deltax;
97  }
98  break;
99  }
100  case SACTSNAP_STEP:
101  deltax = floorf(deltax + 0.5f);
102  *r_val_final = val_initial + deltax;
103  break;
104  case SACTSNAP_OFF:
105  break;
106  }
107 }
108 
110  TransData *td,
111  const eAnimEdit_AutoSnap autosnap,
112  float *r_val_final)
113 {
114  BLI_assert(autosnap != SACTSNAP_OFF);
115 
116  float val = td->loc[0];
117  float ival = td->iloc[0];
118  AnimData *adt = (!ELEM(t->spacetype, SPACE_NLA, SPACE_SEQ)) ? td->extra : NULL;
119 
120  /* Convert frame to nla-action time (if needed) */
121  if (adt) {
123  ival = BKE_nla_tweakedit_remap(adt, ival, NLATIME_CONVERT_MAP);
124  }
125 
126  snapFrameTransform(t, autosnap, ival, val, &val);
127 
128  /* Convert frame out of nla-action time. */
129  if (adt) {
131  }
132 
133  *r_val_final = val;
134 }
135 
typedef float(TangentPoint)[2]
@ NLATIME_CONVERT_MAP
Definition: BKE_nla.h:360
@ NLATIME_CONVERT_UNMAP
Definition: BKE_nla.h:357
float BKE_nla_tweakedit_remap(struct AnimData *adt, float cframe, short mode)
Definition: nla.c:642
#define BLI_assert(a)
Definition: BLI_assert.h:46
#define ELEM(...)
eAnimEdit_AutoSnap
@ SACTSNAP_OFF
@ SACTSNAP_SECOND
@ SACTSNAP_TSTEP
@ SACTSNAP_MARKER
@ SACTSNAP_STEP
@ SACTSNAP_FRAME
#define FPS
@ SPACE_ACTION
@ SPACE_NLA
@ SPACE_SEQ
@ SPACE_GRAPH
@ TFM_TRANSLATION
Definition: ED_transform.h:30
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
int ED_markers_find_nearest_marker_time(ListBase *markers, float x)
Definition: anim_markers.c:163
Scene scene
#define floorf(x)
Definition: metal/compat.h:224
T floor(const T &a)
short autosnap
bool activeSnap(const TransInfo *t)
short getAnimEdit_SnapMode(TransInfo *t)
void transform_snap_anim_flush_data(TransInfo *t, TransData *td, const eAnimEdit_AutoSnap autosnap, float *r_val_final)
void snapFrameTransform(TransInfo *t, const eAnimEdit_AutoSnap autosnap, const float val_initial, const float val_final, float *r_val_final)