49 const float time = scene->r.cfra + scene->r.subframe;
50 const float x =
float(time * scene->r.framelen);
118 if (scene->r.sfra < scene->r.efra) {
172 immUniform4f(
"color1", color[0], color[1], color[2], color[3]);
218 if (
G.is_rendering) {
258 short only_keys = short(ked->
i1);
261 if (only_keys == 0) {
277 short only_keys = short(ked->
i1);
280 if (only_keys == 0) {
302 ked.
data = (
void *)adt;
303 ked.
i1 =
int(only_keys);
347 if (use_preview_only) {
350 bool replace =
false;
352 fcu->
bezt, scene->r.psfra, fcu->
totvert, &replace);
355 fcu->
bezt, scene->r.pefra + 1, fcu->
totvert, &replace);
358 const int unclamped_start =
int(scene->r.psfra - fcu->
fpt[0].
vec[0]);
359 start =
max_ii(unclamped_start, 0);
360 end =
min_ii(unclamped_start + (scene->r.pefra - scene->r.psfra) + 1, fcu->
totvert);
366 for (
int i = start; i < end; i++, bezt++) {
375 max_coord =
max_ff(max_coord, bezt->
vec[1][1]);
376 min_coord =
min_ff(min_coord, bezt->
vec[1][1]);
384 max_coord =
max_ff(max_coord, bezt->
vec[1][1]);
385 min_coord =
min_ff(min_coord, bezt->
vec[1][1]);
386 max_coord =
max_ff(max_coord, prev_bezt->
vec[1][1]);
387 min_coord =
min_ff(min_coord, prev_bezt->
vec[1][1]);
390 const int resol = fcu->
driver ?
395 max_coord =
max_ff(max_coord, prev_bezt->
vec[1][1]);
396 min_coord =
min_ff(min_coord, prev_bezt->
vec[1][1]);
402 float v1[2],
v2[2], v3[2], v4[2];
404 v1[0] = prev_bezt->
vec[1][0];
405 v1[1] = prev_bezt->
vec[1][1];
406 v2[0] = prev_bezt->
vec[2][0];
407 v2[1] = prev_bezt->
vec[2][1];
409 v3[0] = bezt->
vec[0][0];
410 v3[1] = bezt->
vec[0][1];
411 v4[0] = bezt->
vec[1][0];
412 v4[1] = bezt->
vec[1][1];
417 v1[0],
v2[0], v3[0], v4[0], data, resol,
sizeof(
float[3]));
419 v1[1],
v2[1], v3[1], v4[1], data + 1, resol,
sizeof(
float[3]));
421 for (
int j = 0; j <= resol; ++j) {
422 const float *fp = &data[j * 3];
423 max_coord =
max_ff(max_coord, fp[1]);
424 min_coord =
min_ff(min_coord, fp[1]);
431 float step_size = (bezt->
vec[1][0] - prev_bezt->
vec[1][0]) / resol;
432 for (
int j = 0; j <= resol; j++) {
433 float eval_time = prev_bezt->
vec[1][0] + step_size * j;
435 max_coord =
max_ff(max_coord, eval_value);
436 min_coord =
min_ff(min_coord, eval_value);
446 for (
int i = start; i < end; ++i, ++fpt) {
447 min_coord =
min_ff(min_coord, fpt->
vec[1]);
448 max_coord =
max_ff(max_coord, fpt->
vec[1]);
454 *r_min_coord = min_coord;
457 *r_max_coord = max_coord;
463 float factor = 1.0f, offset = 0.0f;
507 if (min_coord < max_coord &&
ulp_diff_ff(min_coord, max_coord) > 256) {
509 const float range = max_coord - min_coord;
510 factor = 2.0f /
range;
511 offset = -min_coord - range / 2.0f;
574 float cfranext, cfraprev;
575 bool donenext =
false, doneprev =
false;
576 int nextcount = 0, prevcount = 0;
578 cfranext = cfraprev =
float(scene->r.cfra);
607 if (scene->r.cfra ==
int(aknext->
cfra)) {
609 cfranext = aknext->
cfra;
613 if (++nextcount ==
U.view_frame_keyframes) {
617 cfranext = aknext->
cfra;
619 }
while ((aknext !=
nullptr) && (donenext ==
false));
625 if (scene->r.cfra ==
int(akprev->
cfra)) {
630 if (++prevcount ==
U.view_frame_keyframes) {
634 cfraprev = akprev->
cfra;
636 }
while ((akprev !=
nullptr) && (doneprev ==
false));
642 if (doneprev || donenext) {
644 *r_prevfra = cfraprev;
647 *r_prevfra = scene->r.cfra - (cfranext - scene->r.cfra);
651 *r_nextfra = cfranext;
654 *r_nextfra = scene->r.cfra + (scene->r.cfra - cfraprev);
669 int nextfra, prevfra;
671 switch (
U.view_frame_type) {
673 const float fps =
FPS;
674 newrct.
xmax = scene->r.cfra +
U.view_frame_seconds * fps + 1;
675 newrct.
xmin = scene->r.cfra -
U.view_frame_seconds * fps - 1;
676 newrct.
ymax = region->v2d.cur.ymax;
677 newrct.
ymin = region->v2d.cur.ymin;
684 newrct.
xmax = nextfra;
685 newrct.
xmin = prevfra;
686 newrct.
ymax = region->v2d.cur.ymax;
687 newrct.
ymin = region->v2d.cur.ymin;
695 newrct.
xmax = scene->r.cfra + (
w / 2);
696 newrct.
xmin = scene->r.cfra - (
w / 2);
697 newrct.
ymax = region->v2d.cur.ymax;
698 newrct.
ymin = region->v2d.cur.ymin;
710 const float margin_in_px = 4 * keyframe_size;
720 const float margin_in_frames = margin_in_px * target_scale;
726 const float margin = std::min(margin_in_frames, margin_max);
728 rctf rect_with_margin = view_rect;
729 rect_with_margin.
xmin -= margin;
730 rect_with_margin.
xmax += margin;
732 return rect_with_margin;
Mask * CTX_data_edit_mask(const bContext *C)
Object * CTX_data_active_object(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
void BKE_curve_forward_diff_bezier(float q0, float q1, float q2, float q3, float *p, int it, int stride)
int BKE_fcurve_bezt_binarysearch_index(const BezTriple array[], float frame, int arraylen, bool *r_replace)
float evaluate_fcurve_only_curve(const FCurve *fcu, float evaltime)
void BKE_fcurve_correct_bezpart(const float v1[2], float v2[2], float v3[2], const float v4[2])
struct MaskLayer * BKE_mask_layer_active(struct Mask *mask)
float BKE_nla_tweakedit_remap(AnimData *adt, float cframe, short mode)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
MINLINE float max_ff(float a, float b)
MINLINE int min_ii(int a, int b)
MINLINE float min_ff(float a, float b)
MINLINE int max_ii(int a, int b)
MINLINE uint ulp_diff_ff(float a, float b)
MINLINE float len_v2v2(const float v1[2], const float v2[2]) ATTR_WARN_UNUSED_RESULT
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
Object is a sort of wrapper for general info.
@ ZOOM_FRAME_MODE_SECONDS
@ ZOOM_FRAME_MODE_KEYFRAMES
@ ZOOM_FRAME_MODE_KEEP_RANGE
@ ANIM_UNITCONV_NORMALIZE
@ ANIM_UNITCONV_NORMALIZE_FREEZE
short(*)(KeyframeEditData *ked, BezTriple *bezt) KeyframeEditFunc
@ GPU_SHADER_2D_DIAG_STRIPES
@ GPU_SHADER_3D_UNIFORM_COLOR
void GPU_blend(eGPUBlend blend)
void GPU_line_width(float width)
#define RNA_SUBTYPE_UNIT(subtype)
void UI_GetThemeColorShadeAlpha4fv(int colorid, int coloffset, int alphaoffset, float col[4])
void UI_view2d_smooth_view(const bContext *C, ARegion *region, const rctf *cur, int smooth_viewtx)
short ANIM_get_normalization_flags(SpaceLink *space_link)
AnimData * ANIM_nla_mapping_get(bAnimContext *ac, bAnimListElem *ale)
static short bezt_nlamapping_apply(KeyframeEditData *ked, BezTriple *bezt)
static bool find_prev_next_keyframes(bContext *C, int *r_nextfra, int *r_prevfra)
void ANIM_draw_action_framerange(AnimData *adt, bAction *action, View2D *v2d, float ymin, float ymax)
static float normalization_factor_get(Scene *scene, FCurve *fcu, short flag, float *r_offset)
void ANIM_draw_cfra(const bContext *C, View2D *v2d, short flag)
void ANIM_center_frame(bContext *C, int smooth_viewtx)
void ANIM_nla_mapping_apply_fcurve(AnimData *adt, FCurve *fcu, bool restore, bool only_keys)
void ANIM_draw_previewrange(const bContext *C, View2D *v2d, int end_frame_width)
static void fcurve_scene_coord_range_get(Scene *scene, const FCurve *fcu, float *r_min_coord, float *r_max_coord)
rctf ANIM_frame_range_view2d_add_xmargin(const View2D &view_2d, const rctf view_rect)
float ANIM_unit_mapping_get_factor(Scene *scene, ID *id, FCurve *fcu, short flag, float *r_offset)
static short bezt_nlamapping_restore(KeyframeEditData *ked, BezTriple *bezt)
void ANIM_draw_framerange(Scene *scene, View2D *v2d)
ATTR_WARN_UNUSED_RESULT const BMVert * v2
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
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
short ANIM_fcurve_keyframes_loop(KeyframeEditData *ked, FCurve *fcu, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb)
void mask_to_keylist(bDopeSheet *, MaskLayer *masklay, AnimKeylist *keylist)
const ActKeyColumn * ED_keylist_find_prev(const AnimKeylist *keylist, const float cfra)
void gpencil_to_keylist(bDopeSheet *ads, bGPdata *gpd, AnimKeylist *keylist, const bool active)
void scene_to_keylist(bDopeSheet *ads, Scene *sce, AnimKeylist *keylist, const int saction_flag, blender::float2 range)
void ob_to_keylist(bDopeSheet *ads, Object *ob, AnimKeylist *keylist, const int saction_flag, blender::float2 range)
void ED_keylist_prepare_for_direct_access(AnimKeylist *keylist)
AnimKeylist * ED_keylist_create()
void ED_keylist_free(AnimKeylist *keylist)
const ActKeyColumn * ED_keylist_find_next(const AnimKeylist *keylist, const float cfra)
PropertySubType RNA_property_subtype(PropertyRNA *prop)
PointerRNA RNA_id_pointer_create(ID *id)
bool RNA_path_resolve_property(const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)