2012-04-30 16:19:20 +00:00
|
|
|
/*
|
|
|
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
|
|
|
*
|
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
|
*
|
|
|
|
|
* The Original Code is Copyright (C) 2012 Blender Foundation.
|
|
|
|
|
* All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* Contributor(s): Blender Foundation,
|
|
|
|
|
* Sergey Sharybin
|
|
|
|
|
*
|
|
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
|
|
|
*/
|
|
|
|
|
|
2012-06-08 23:43:11 +00:00
|
|
|
/** \file blender/editors/space_clip/clip_dopesheet_draw.c
|
2012-04-30 16:19:20 +00:00
|
|
|
* \ingroup spclip
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "DNA_movieclip_types.h"
|
|
|
|
|
#include "DNA_scene_types.h"
|
|
|
|
|
|
|
|
|
|
#include "BLI_utildefines.h"
|
|
|
|
|
#include "BLI_math.h"
|
2012-08-20 23:06:17 +00:00
|
|
|
#include "BLI_rect.h"
|
2012-04-30 16:19:20 +00:00
|
|
|
|
2013-04-05 17:56:54 +00:00
|
|
|
#include "BKE_context.h"
|
|
|
|
|
#include "BKE_movieclip.h"
|
|
|
|
|
|
2012-04-30 16:19:20 +00:00
|
|
|
#include "ED_screen.h"
|
|
|
|
|
#include "ED_clip.h"
|
|
|
|
|
|
|
|
|
|
#include "BIF_gl.h"
|
|
|
|
|
|
|
|
|
|
#include "WM_types.h"
|
|
|
|
|
|
|
|
|
|
#include "UI_interface.h"
|
|
|
|
|
#include "UI_resources.h"
|
|
|
|
|
#include "UI_view2d.h"
|
|
|
|
|
|
|
|
|
|
#include "BLF_api.h"
|
|
|
|
|
|
|
|
|
|
#include "RNA_access.h"
|
|
|
|
|
|
2017-02-01 22:42:50 -05:00
|
|
|
#include "GPU_immediate.h"
|
|
|
|
|
|
2012-06-10 19:59:02 +00:00
|
|
|
#include "clip_intern.h" /* own include */
|
2012-04-30 16:19:20 +00:00
|
|
|
|
|
|
|
|
static void track_channel_color(MovieTrackingTrack *track, float default_color[3], float color[3])
|
|
|
|
|
{
|
|
|
|
|
if (track->flag & TRACK_CUSTOMCOLOR) {
|
|
|
|
|
float bg[3];
|
|
|
|
|
UI_GetThemeColor3fv(TH_HEADER, bg);
|
|
|
|
|
|
|
|
|
|
interp_v3_v3v3(color, track->color, bg, 0.5);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (default_color)
|
|
|
|
|
copy_v3_v3(color, default_color);
|
|
|
|
|
else
|
|
|
|
|
UI_GetThemeColor3fv(TH_HEADER, color);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-02-11 00:24:59 -05:00
|
|
|
static void draw_keyframe_shape(float x, float y, bool sel, float alpha,
|
|
|
|
|
unsigned int pos_id, unsigned int color_id)
|
2012-04-30 16:19:20 +00:00
|
|
|
{
|
2017-02-11 00:24:59 -05:00
|
|
|
float color[4] = { 0.91f, 0.91f, 0.91f, alpha };
|
|
|
|
|
if (sel) {
|
|
|
|
|
UI_GetThemeColorShadeAlpha4fv(TH_STRIP_SELECT, 50, -255 * (1.0f - alpha), color);
|
|
|
|
|
}
|
2012-04-30 16:19:20 +00:00
|
|
|
|
2017-02-11 00:24:59 -05:00
|
|
|
immAttrib4fv(color_id, color);
|
|
|
|
|
immVertex2f(pos_id, x, y);
|
2012-04-30 16:19:20 +00:00
|
|
|
}
|
|
|
|
|
|
2017-02-11 00:24:59 -05:00
|
|
|
static void clip_draw_dopesheet_background(ARegion *ar, MovieClip *clip, unsigned int pos_id)
|
2013-02-22 10:13:15 +00:00
|
|
|
{
|
|
|
|
|
View2D *v2d = &ar->v2d;
|
|
|
|
|
MovieTracking *tracking = &clip->tracking;
|
|
|
|
|
MovieTrackingDopesheet *dopesheet = &tracking->dopesheet;
|
|
|
|
|
MovieTrackingDopesheetCoverageSegment *coverage_segment;
|
2017-02-01 22:42:50 -05:00
|
|
|
|
2013-02-22 10:13:15 +00:00
|
|
|
for (coverage_segment = dopesheet->coverage_segments.first;
|
|
|
|
|
coverage_segment;
|
|
|
|
|
coverage_segment = coverage_segment->next)
|
|
|
|
|
{
|
|
|
|
|
if (coverage_segment->coverage < TRACKING_COVERAGE_OK) {
|
|
|
|
|
int start_frame = BKE_movieclip_remap_clip_to_scene_frame(clip, coverage_segment->start_frame);
|
|
|
|
|
int end_frame = BKE_movieclip_remap_clip_to_scene_frame(clip, coverage_segment->end_frame);
|
|
|
|
|
|
2014-02-13 18:31:02 +06:00
|
|
|
if (coverage_segment->coverage == TRACKING_COVERAGE_BAD) {
|
2017-02-01 22:42:50 -05:00
|
|
|
immUniformColor4f(1.0f, 0.0f, 0.0f, 0.07f);
|
2014-02-13 18:31:02 +06:00
|
|
|
}
|
2017-02-11 00:24:59 -05:00
|
|
|
else {
|
2017-02-01 22:42:50 -05:00
|
|
|
immUniformColor4f(1.0f, 1.0f, 0.0f, 0.07f);
|
2017-02-11 00:24:59 -05:00
|
|
|
}
|
2013-02-22 10:13:15 +00:00
|
|
|
|
2017-02-11 00:24:59 -05:00
|
|
|
immRectf(pos_id, start_frame, v2d->cur.ymin, end_frame, v2d->cur.ymax);
|
2013-02-22 10:13:15 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2012-04-30 16:19:20 +00:00
|
|
|
void clip_draw_dopesheet_main(SpaceClip *sc, ARegion *ar, Scene *scene)
|
|
|
|
|
{
|
2012-06-19 14:26:29 +00:00
|
|
|
MovieClip *clip = ED_space_clip_get_clip(sc);
|
2012-04-30 16:19:20 +00:00
|
|
|
View2D *v2d = &ar->v2d;
|
|
|
|
|
|
|
|
|
|
/* frame range */
|
|
|
|
|
clip_draw_sfra_efra(v2d, scene);
|
|
|
|
|
|
|
|
|
|
if (clip) {
|
|
|
|
|
MovieTracking *tracking = &clip->tracking;
|
|
|
|
|
MovieTrackingDopesheet *dopesheet = &tracking->dopesheet;
|
|
|
|
|
MovieTrackingDopesheetChannel *channel;
|
|
|
|
|
float strip[4], selected_strip[4];
|
2013-02-14 13:47:49 +00:00
|
|
|
float height = (dopesheet->tot_channel * CHANNEL_STEP) + (CHANNEL_HEIGHT);
|
2017-02-11 00:24:59 -05:00
|
|
|
|
|
|
|
|
unsigned int keyframe_ct = 0;
|
|
|
|
|
|
2017-02-01 22:42:50 -05:00
|
|
|
VertexFormat *format = immVertexFormat();
|
2017-02-11 00:24:59 -05:00
|
|
|
unsigned int pos_id = add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT);
|
|
|
|
|
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
|
2012-06-12 14:59:36 +00:00
|
|
|
|
|
|
|
|
/* don't use totrect set, as the width stays the same
|
|
|
|
|
* (NOTE: this is ok here, the configuration is pretty straightforward)
|
|
|
|
|
*/
|
|
|
|
|
v2d->tot.ymin = (float)(-height);
|
2012-04-30 16:19:20 +00:00
|
|
|
|
2017-02-11 00:24:59 -05:00
|
|
|
float y = (float) CHANNEL_FIRST;
|
2012-04-30 16:19:20 +00:00
|
|
|
|
|
|
|
|
/* setup colors for regular and selected strips */
|
|
|
|
|
UI_GetThemeColor3fv(TH_STRIP, strip);
|
|
|
|
|
UI_GetThemeColor3fv(TH_STRIP_SELECT, selected_strip);
|
|
|
|
|
|
|
|
|
|
strip[3] = 0.5f;
|
|
|
|
|
selected_strip[3] = 1.0f;
|
|
|
|
|
|
|
|
|
|
glEnable(GL_BLEND);
|
|
|
|
|
|
2017-02-11 00:24:59 -05:00
|
|
|
clip_draw_dopesheet_background(ar, clip, pos_id);
|
2013-02-22 10:13:15 +00:00
|
|
|
|
2012-04-30 16:19:20 +00:00
|
|
|
for (channel = dopesheet->channels.first; channel; channel = channel->next) {
|
|
|
|
|
float yminc = (float) (y - CHANNEL_HEIGHT_HALF);
|
|
|
|
|
float ymaxc = (float) (y + CHANNEL_HEIGHT_HALF);
|
|
|
|
|
|
|
|
|
|
/* check if visible */
|
|
|
|
|
if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
|
|
|
|
|
IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax))
|
|
|
|
|
{
|
|
|
|
|
MovieTrackingTrack *track = channel->track;
|
2014-03-31 15:31:28 +06:00
|
|
|
int i;
|
|
|
|
|
bool sel = (track->flag & TRACK_DOPE_SEL) != 0;
|
2012-04-30 16:19:20 +00:00
|
|
|
|
|
|
|
|
/* selection background */
|
|
|
|
|
if (sel) {
|
|
|
|
|
float color[4] = {0.0f, 0.0f, 0.0f, 0.3f};
|
|
|
|
|
float default_color[4] = {0.8f, 0.93f, 0.8f, 0.3f};
|
|
|
|
|
|
|
|
|
|
track_channel_color(track, default_color, color);
|
2017-02-01 22:42:50 -05:00
|
|
|
immUniformColor4fv(color);
|
2012-04-30 16:19:20 +00:00
|
|
|
|
2017-02-11 00:24:59 -05:00
|
|
|
immRectf(pos_id, v2d->cur.xmin, (float) y - CHANNEL_HEIGHT_HALF,
|
|
|
|
|
v2d->cur.xmax + EXTRA_SCROLL_PAD, (float) y + CHANNEL_HEIGHT_HALF);
|
2012-04-30 16:19:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* tracked segments */
|
2012-05-03 17:52:34 +00:00
|
|
|
for (i = 0; i < channel->tot_segment; i++) {
|
2012-06-10 17:09:35 +00:00
|
|
|
int start_frame = BKE_movieclip_remap_clip_to_scene_frame(clip, channel->segments[2 * i]);
|
|
|
|
|
int end_frame = BKE_movieclip_remap_clip_to_scene_frame(clip, channel->segments[2 * i + 1]);
|
2012-05-03 17:52:34 +00:00
|
|
|
|
2017-02-11 00:24:59 -05:00
|
|
|
immUniformColor4fv(sel ? selected_strip : strip);
|
2012-05-03 19:28:41 +00:00
|
|
|
|
2012-05-03 17:52:34 +00:00
|
|
|
if (start_frame != end_frame) {
|
2017-02-11 00:24:59 -05:00
|
|
|
immRectf(pos_id, start_frame, (float) y - STRIP_HEIGHT_HALF,
|
|
|
|
|
end_frame, (float) y + STRIP_HEIGHT_HALF);
|
|
|
|
|
keyframe_ct += 2;
|
2012-05-03 17:52:34 +00:00
|
|
|
}
|
|
|
|
|
else {
|
2017-02-11 00:24:59 -05:00
|
|
|
keyframe_ct++;
|
2012-04-30 16:19:20 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* keyframes */
|
|
|
|
|
i = 0;
|
|
|
|
|
while (i < track->markersnr) {
|
|
|
|
|
MovieTrackingMarker *marker = &track->markers[i];
|
|
|
|
|
|
2012-06-10 17:09:35 +00:00
|
|
|
if ((marker->flag & (MARKER_DISABLED | MARKER_TRACKED)) == 0) {
|
2017-02-11 00:24:59 -05:00
|
|
|
keyframe_ct++;
|
2012-06-10 17:09:35 +00:00
|
|
|
}
|
2012-04-30 16:19:20 +00:00
|
|
|
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* adjust y-position for next one */
|
|
|
|
|
y -= CHANNEL_STEP;
|
|
|
|
|
}
|
|
|
|
|
|
2017-02-11 00:24:59 -05:00
|
|
|
immUnbindProgram();
|
|
|
|
|
|
|
|
|
|
if (keyframe_ct > 0) {
|
|
|
|
|
/* draw keyframe markers */
|
|
|
|
|
format = immVertexFormat();
|
|
|
|
|
pos_id = add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT);
|
|
|
|
|
unsigned int size_id = add_attrib(format, "size", COMP_F32, 1, KEEP_FLOAT);
|
|
|
|
|
unsigned int color_id = add_attrib(format, "color", COMP_U8, 4, NORMALIZE_INT_TO_FLOAT);
|
|
|
|
|
unsigned int outline_color_id = add_attrib(format, "outlineColor", COMP_U8, 4, NORMALIZE_INT_TO_FLOAT);
|
|
|
|
|
|
|
|
|
|
immBindBuiltinProgram(GPU_SHADER_KEYFRAME_DIAMOND);
|
|
|
|
|
|
|
|
|
|
immBegin(PRIM_POINTS, keyframe_ct);
|
|
|
|
|
|
|
|
|
|
/* all same size with black outline */
|
|
|
|
|
immAttrib1f(size_id, 2.0f * STRIP_HEIGHT_HALF);
|
|
|
|
|
immAttrib3ub(outline_color_id, 0, 0, 0);
|
|
|
|
|
|
|
|
|
|
y = (float) CHANNEL_FIRST; /* start again at the top */
|
|
|
|
|
for (channel = dopesheet->channels.first; channel; channel = channel->next) {
|
|
|
|
|
float yminc = (float) (y - CHANNEL_HEIGHT_HALF);
|
|
|
|
|
float ymaxc = (float) (y + CHANNEL_HEIGHT_HALF);
|
|
|
|
|
|
|
|
|
|
/* check if visible */
|
|
|
|
|
if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
|
|
|
|
|
IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax))
|
|
|
|
|
{
|
|
|
|
|
MovieTrackingTrack *track = channel->track;
|
|
|
|
|
int i;
|
|
|
|
|
bool sel = (track->flag & TRACK_DOPE_SEL) != 0;
|
|
|
|
|
float alpha = (track->flag & TRACK_LOCKED) ? 0.5f : 1.0f;
|
|
|
|
|
|
|
|
|
|
/* tracked segments */
|
|
|
|
|
for (i = 0; i < channel->tot_segment; i++) {
|
|
|
|
|
int start_frame = BKE_movieclip_remap_clip_to_scene_frame(clip, channel->segments[2 * i]);
|
|
|
|
|
int end_frame = BKE_movieclip_remap_clip_to_scene_frame(clip, channel->segments[2 * i + 1]);
|
|
|
|
|
|
|
|
|
|
if (start_frame != end_frame) {
|
|
|
|
|
draw_keyframe_shape(start_frame, y, sel, alpha, pos_id, color_id);
|
|
|
|
|
draw_keyframe_shape(end_frame, y, sel, alpha, pos_id, color_id);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
draw_keyframe_shape(start_frame, y, sel, alpha, pos_id, color_id);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* keyframes */
|
|
|
|
|
i = 0;
|
|
|
|
|
while (i < track->markersnr) {
|
|
|
|
|
MovieTrackingMarker *marker = &track->markers[i];
|
|
|
|
|
|
|
|
|
|
if ((marker->flag & (MARKER_DISABLED | MARKER_TRACKED)) == 0) {
|
|
|
|
|
int framenr = BKE_movieclip_remap_clip_to_scene_frame(clip, marker->framenr);
|
|
|
|
|
|
|
|
|
|
draw_keyframe_shape(framenr, y, sel, alpha, pos_id, color_id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* adjust y-position for next one */
|
|
|
|
|
y -= CHANNEL_STEP;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
immEnd();
|
|
|
|
|
immUnbindProgram();
|
|
|
|
|
}
|
|
|
|
|
|
2012-04-30 16:19:20 +00:00
|
|
|
glDisable(GL_BLEND);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* current frame */
|
|
|
|
|
clip_draw_cfra(sc, ar, scene);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void clip_draw_dopesheet_channels(const bContext *C, ARegion *ar)
|
|
|
|
|
{
|
|
|
|
|
ScrArea *sa = CTX_wm_area(C);
|
|
|
|
|
SpaceClip *sc = CTX_wm_space_clip(C);
|
|
|
|
|
View2D *v2d = &ar->v2d;
|
2012-06-19 14:26:29 +00:00
|
|
|
MovieClip *clip = ED_space_clip_get_clip(sc);
|
2014-11-09 21:20:40 +01:00
|
|
|
uiStyle *style = UI_style_get();
|
2012-04-30 16:19:20 +00:00
|
|
|
int fontid = style->widget.uifont_id;
|
2017-02-01 22:42:50 -05:00
|
|
|
|
2012-04-30 16:19:20 +00:00
|
|
|
if (!clip)
|
|
|
|
|
return;
|
|
|
|
|
|
2017-02-11 00:24:59 -05:00
|
|
|
MovieTracking *tracking = &clip->tracking;
|
|
|
|
|
MovieTrackingDopesheet *dopesheet = &tracking->dopesheet;
|
|
|
|
|
int height = (dopesheet->tot_channel * CHANNEL_STEP) + (CHANNEL_HEIGHT);
|
2012-04-30 16:19:20 +00:00
|
|
|
|
2012-09-15 11:48:20 +00:00
|
|
|
if (height > BLI_rcti_size_y(&v2d->mask)) {
|
2012-05-03 17:52:34 +00:00
|
|
|
/* don't use totrect set, as the width stays the same
|
|
|
|
|
* (NOTE: this is ok here, the configuration is pretty straightforward)
|
2012-04-30 16:19:20 +00:00
|
|
|
*/
|
|
|
|
|
v2d->tot.ymin = (float)(-height);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* need to do a view-sync here, so that the keys area doesn't jump around (it must copy this) */
|
|
|
|
|
UI_view2d_sync(NULL, sa, v2d, V2D_LOCK_COPY);
|
|
|
|
|
|
|
|
|
|
/* loop through channels, and set up drawing depending on their type
|
|
|
|
|
* first pass: just the standard GL-drawing for backdrop + text
|
|
|
|
|
*/
|
2017-02-11 00:24:59 -05:00
|
|
|
float y = (float) CHANNEL_FIRST;
|
2012-04-30 16:19:20 +00:00
|
|
|
|
2017-02-11 00:24:59 -05:00
|
|
|
VertexFormat *format = immVertexFormat();
|
|
|
|
|
unsigned pos = add_attrib(format, "pos", GL_FLOAT, 2, KEEP_FLOAT);
|
2012-04-30 16:19:20 +00:00
|
|
|
|
2017-02-11 00:24:59 -05:00
|
|
|
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
|
|
|
|
|
|
|
|
|
|
MovieTrackingDopesheetChannel *channel;
|
2012-04-30 16:19:20 +00:00
|
|
|
for (channel = dopesheet->channels.first; channel; channel = channel->next) {
|
|
|
|
|
float yminc = (float) (y - CHANNEL_HEIGHT_HALF);
|
|
|
|
|
float ymaxc = (float) (y + CHANNEL_HEIGHT_HALF);
|
|
|
|
|
|
|
|
|
|
/* check if visible */
|
|
|
|
|
if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
|
|
|
|
|
IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax))
|
|
|
|
|
{
|
|
|
|
|
MovieTrackingTrack *track = channel->track;
|
2017-02-11 00:24:59 -05:00
|
|
|
float color[3];
|
2012-04-30 16:19:20 +00:00
|
|
|
track_channel_color(track, NULL, color);
|
2017-02-01 22:42:50 -05:00
|
|
|
immUniformColor3fv(color);
|
2012-04-30 16:19:20 +00:00
|
|
|
|
2017-02-01 22:42:50 -05:00
|
|
|
immRectf(pos, v2d->cur.xmin, (float) y - CHANNEL_HEIGHT_HALF,
|
2017-02-11 00:24:59 -05:00
|
|
|
v2d->cur.xmax + EXTRA_SCROLL_PAD, (float) y + CHANNEL_HEIGHT_HALF);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* adjust y-position for next one */
|
|
|
|
|
y -= CHANNEL_STEP;
|
|
|
|
|
}
|
|
|
|
|
immUnbindProgram();
|
|
|
|
|
|
|
|
|
|
/* second pass: text */
|
|
|
|
|
y = (float) CHANNEL_FIRST;
|
|
|
|
|
|
|
|
|
|
BLF_size(fontid, 11.0f * U.pixelsize, U.dpi);
|
|
|
|
|
|
|
|
|
|
for (channel = dopesheet->channels.first; channel; channel = channel->next) {
|
|
|
|
|
float yminc = (float) (y - CHANNEL_HEIGHT_HALF);
|
|
|
|
|
float ymaxc = (float) (y + CHANNEL_HEIGHT_HALF);
|
|
|
|
|
|
|
|
|
|
/* check if visible */
|
|
|
|
|
if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
|
|
|
|
|
IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax))
|
|
|
|
|
{
|
|
|
|
|
MovieTrackingTrack *track = channel->track;
|
|
|
|
|
bool sel = (track->flag & TRACK_DOPE_SEL) != 0;
|
2012-04-30 16:19:20 +00:00
|
|
|
|
2017-02-07 20:53:20 -02:00
|
|
|
UI_FontThemeColor(fontid, sel ? TH_TEXT_HI : TH_TEXT);
|
2012-04-30 16:19:20 +00:00
|
|
|
|
2017-02-11 00:24:59 -05:00
|
|
|
float font_height = BLF_height(fontid, channel->name, sizeof(channel->name));
|
2012-04-30 16:19:20 +00:00
|
|
|
BLF_position(fontid, v2d->cur.xmin + CHANNEL_PAD,
|
2012-06-10 19:59:02 +00:00
|
|
|
y - font_height / 2.0f, 0.0f);
|
2012-06-12 17:11:00 +00:00
|
|
|
BLF_draw(fontid, channel->name, strlen(channel->name));
|
2012-04-30 16:19:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* adjust y-position for next one */
|
|
|
|
|
y -= CHANNEL_STEP;
|
|
|
|
|
}
|
|
|
|
|
|
2017-02-11 00:24:59 -05:00
|
|
|
/* third pass: widgets */
|
|
|
|
|
uiBlock *block = UI_block_begin(C, ar, __func__, UI_EMBOSS);
|
2012-04-30 16:19:20 +00:00
|
|
|
y = (float) CHANNEL_FIRST;
|
|
|
|
|
|
2014-01-17 08:37:45 +11:00
|
|
|
/* get RNA properties (once) */
|
2017-02-11 00:24:59 -05:00
|
|
|
PropertyRNA *chan_prop_lock = RNA_struct_type_find_property(&RNA_MovieTrackingTrack, "lock");
|
2014-01-17 08:37:45 +11:00
|
|
|
BLI_assert(chan_prop_lock);
|
|
|
|
|
|
2012-04-30 16:19:20 +00:00
|
|
|
glEnable(GL_BLEND);
|
|
|
|
|
for (channel = dopesheet->channels.first; channel; channel = channel->next) {
|
|
|
|
|
float yminc = (float)(y - CHANNEL_HEIGHT_HALF);
|
|
|
|
|
float ymaxc = (float)(y + CHANNEL_HEIGHT_HALF);
|
|
|
|
|
|
|
|
|
|
/* check if visible */
|
|
|
|
|
if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
|
|
|
|
|
IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax))
|
|
|
|
|
{
|
|
|
|
|
MovieTrackingTrack *track = channel->track;
|
2012-05-26 22:21:56 +00:00
|
|
|
const int icon = (track->flag & TRACK_LOCKED) ? ICON_LOCKED : ICON_UNLOCKED;
|
2012-04-30 16:19:20 +00:00
|
|
|
PointerRNA ptr;
|
|
|
|
|
|
|
|
|
|
RNA_pointer_create(&clip->id, &RNA_MovieTrackingTrack, track, &ptr);
|
|
|
|
|
|
2014-11-09 21:20:40 +01:00
|
|
|
UI_block_emboss_set(block, UI_EMBOSS_NONE);
|
|
|
|
|
uiDefIconButR_prop(block, UI_BTYPE_ICON_TOGGLE, 1, icon,
|
2014-01-17 08:37:45 +11:00
|
|
|
v2d->cur.xmax - UI_UNIT_X - CHANNEL_PAD, y - UI_UNIT_Y / 2.0f,
|
|
|
|
|
UI_UNIT_X, UI_UNIT_Y, &ptr, chan_prop_lock, 0, 0, 0, 0, 0, NULL);
|
2014-11-09 21:20:40 +01:00
|
|
|
UI_block_emboss_set(block, UI_EMBOSS);
|
2012-04-30 16:19:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* adjust y-position for next one */
|
|
|
|
|
y -= CHANNEL_STEP;
|
|
|
|
|
}
|
|
|
|
|
glDisable(GL_BLEND);
|
|
|
|
|
|
2014-11-09 21:20:40 +01:00
|
|
|
UI_block_end(C, block);
|
|
|
|
|
UI_block_draw(C, block);
|
2012-04-30 16:19:20 +00:00
|
|
|
}
|