visualization of the interpolation type

This commit is contained in:
Erik Faye-Lund 2008-02-16 17:02:26 +00:00
parent 2b1a79cc9c
commit 86543e1d04
3 changed files with 47 additions and 12 deletions

View File

@ -39,6 +39,10 @@ TrackView::TrackView()
rowPen = CreatePen(PS_SOLID, 1, darken(GetSysColor(COLOR_WINDOW), 0.7f)); rowPen = CreatePen(PS_SOLID, 1, darken(GetSysColor(COLOR_WINDOW), 0.7f));
rowSelectPen = CreatePen(PS_SOLID, 1, darken(GetSysColor(COLOR_HIGHLIGHT), 0.7f)); rowSelectPen = CreatePen(PS_SOLID, 1, darken(GetSysColor(COLOR_HIGHLIGHT), 0.7f));
lerpPen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
cosinePen = CreatePen(PS_SOLID, 2, RGB(0, 255, 0));
rampPen = CreatePen(PS_SOLID, 2, RGB(0, 0, 255));
editBrush = CreateSolidBrush(RGB(255, 255, 0)); // yellow editBrush = CreateSolidBrush(RGB(255, 255, 0)); // yellow
@ -214,8 +218,10 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks)
for (int track = 0; track <= lastTrack; ++track, ++trackIter) for (int track = 0; track <= lastTrack; ++track, ++trackIter)
{ {
assert(trackIter != syncData->tracks.end()); assert(trackIter != syncData->tracks.end());
size_t trackIndex = trackIter->second;
const sync::Track &t = *syncData->actualTracks[trackIndex];
if (track < firstTrack) continue; if (track < firstTrack) continue;
for (int row = firstRow; row <= lastRow; ++row) for (int row = firstRow; row <= lastRow; ++row)
{ {
RECT patternDataRect; RECT patternDataRect;
@ -226,6 +232,15 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks)
if (!RectVisible(hdc, &patternDataRect)) continue; if (!RectVisible(hdc, &patternDataRect)) continue;
sync::Track::KeyFrame::InterpolationType interpolationType = sync::Track::KeyFrame::IT_STEP;
sync::Track::KeyFrameContainer::const_iterator upper = t.keyFrames.upper_bound(row);
sync::Track::KeyFrameContainer::const_iterator lower = upper;
if (lower != t.keyFrames.end())
{
lower--;
if (lower != t.keyFrames.end()) interpolationType = lower->second.interpolationType;
}
bool selected = (track >= selectLeft && track <= selectRight) && (row >= selectTop && row <= selectBottom); bool selected = (track >= selectLeft && track <= selectRight) && (row >= selectTop && row <= selectBottom);
HBRUSH baseBrush = bgBaseBrush; HBRUSH baseBrush = bgBaseBrush;
@ -250,6 +265,26 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks)
LineTo(hdc, patternDataRect.right, patternDataRect.top); LineTo(hdc, patternDataRect.right, patternDataRect.top);
} }
switch (interpolationType)
{
case sync::Track::KeyFrame::IT_LERP:
SelectObject(hdc, lerpPen);
break;
case sync::Track::KeyFrame::IT_COSINE:
SelectObject(hdc, cosinePen);
break;
case sync::Track::KeyFrame::IT_RAMP:
SelectObject(hdc, rampPen);
break;
case sync::Track::KeyFrame::IT_STEP:
break;
}
if (interpolationType != sync::Track::KeyFrame::IT_STEP)
{
MoveToEx(hdc, patternDataRect.right - 1, patternDataRect.top, (LPPOINT) NULL);
LineTo(hdc, patternDataRect.right - 1, patternDataRect.bottom);
}
bool drawEditString = false; bool drawEditString = false;
if (row == editRow && track == editTrack) if (row == editRow && track == editTrack)
{ {
@ -259,17 +294,14 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks)
if (editString.size() > 0) drawEditString = true; if (editString.size() > 0) drawEditString = true;
} }
// InvertRect(hdc, &fillRect); bool key = t.isKeyFrame(row);
const sync::Track &track = *syncData->actualTracks[trackIter->second];
bool key = track.isKeyFrame(row);
/* format the text */ /* format the text */
if (drawEditString) _sntprintf_s(temp, 256, editString.c_str()); if (drawEditString) _sntprintf_s(temp, 256, editString.c_str());
else if (!key) _sntprintf_s(temp, 256, _T(" ---")); else if (!key) _sntprintf_s(temp, 256, _T(" ---"));
else else
{ {
float val = track.getKeyFrame(row)->value; float val = t.getKeyFrame(row)->value;
_sntprintf_s(temp, 256, _T("% .2f"), val); _sntprintf_s(temp, 256, _T("% .2f"), val);
} }
@ -659,7 +691,8 @@ void TrackView::editEnterValue()
syncData->exec(cmd); syncData->exec(cmd);
editString.clear(); editString.clear();
invalidatePos(editTrack, editRow); // invalidatePos(editTrack, editRow);
InvalidateRect(getWin(), NULL, FALSE);
} }
else MessageBeep(0); else MessageBeep(0);
} }
@ -679,7 +712,7 @@ void TrackView::editToggleInterpolationType()
return; return;
} }
sync::Track::KeyFrameContainer::const_iterator lower = lower; sync::Track::KeyFrameContainer::const_iterator lower = upper;
lower--; lower--;
// bounds check again // bounds check again
if (lower == t.keyFrames.end()) if (lower == t.keyFrames.end())
@ -737,7 +770,8 @@ void TrackView::editDelete()
else else
{ {
syncData->exec(multiCmd); syncData->exec(multiCmd);
invalidateRange(selectLeft, selectRight, selectTop, selectBottom); InvalidateRect(getWin(), NULL, FALSE);
// invalidateRange(selectLeft, selectRight, selectTop, selectBottom);
} }
} }

View File

@ -123,6 +123,7 @@ private:
HBRUSH selectBaseBrush, selectDarkBrush; HBRUSH selectBaseBrush, selectDarkBrush;
HPEN rowPen, rowSelectPen; HPEN rowPen, rowSelectPen;
HBRUSH editBrush; HBRUSH editBrush;
HPEN lerpPen, cosinePen, rampPen;
/* cursor position */ /* cursor position */
int editRow, editTrack; int editRow, editTrack;

View File

@ -30,12 +30,12 @@ Track &PlayerDevice::getTrack(const std::string &trackName)
{ {
sync::Data::TrackContainer::iterator iter = syncData.tracks.find(trackName); sync::Data::TrackContainer::iterator iter = syncData.tracks.find(trackName);
if (iter != syncData.tracks.end()) return *syncData.actualTracks[iter->second]; if (iter != syncData.tracks.end()) return *syncData.actualTracks[iter->second];
sync::Track *track = new sync::Track(); sync::Track *track = new sync::Track();
// TODO: load data from file // TODO: load data from file
track->setKeyFrame(0, 1.0f); track->setKeyFrame(0, Track::KeyFrame(1.0f, Track::KeyFrame::IT_LERP));
track->setKeyFrame(10, 0.0f); track->setKeyFrame(10, Track::KeyFrame(0.0f, Track::KeyFrame::IT_LERP));
size_t index = syncData.actualTracks.size(); size_t index = syncData.actualTracks.size();
syncData.actualTracks.push_back(track); syncData.actualTracks.push_back(track);