|
|
7a5892 |
|
|
|
7a5892 |
|
|
|
7a5892 |
#include <tools modifierline.h="" modifiers=""></tools>
|
|
|
7a5892 |
|
|
|
7a5892 |
|
|
|
7a5892 |
//*****************************************************************************************
|
|
|
7a5892 |
// TModifierLine implementation
|
|
|
7a5892 |
//*****************************************************************************************
|
|
|
7a5892 |
|
|
|
7a5892 |
|
|
|
7a5892 |
static inline void calcFixedAngle(const TTrackPoint &p0, TTrackPoint &p1) {
|
|
|
7a5892 |
TPointD p = p1.position - p0.position;
|
|
|
7a5892 |
double l = sqrt(p.x*p.x + p.y*p.y);
|
|
|
7a5892 |
if (l < TConsts::epsilon) {
|
|
|
7a5892 |
p = TPointD();
|
|
|
7a5892 |
} else {
|
|
|
7a5892 |
double a = atan2(p.y, p.x);
|
|
|
7a5892 |
a = round(a*4/M_PI)*M_PI/4;
|
|
|
7a5892 |
p.x = cos(a)*l;
|
|
|
7a5892 |
p.y = sin(a)*l;
|
|
|
7a5892 |
}
|
|
|
7a5892 |
p1.position = p0.position + p;
|
|
|
7a5892 |
}
|
|
|
7a5892 |
|
|
|
7a5892 |
|
|
|
7a5892 |
TTrackPoint TModifierLine::Modifier::calcPoint(double originalIndex) {
|
|
|
7a5892 |
if (original.empty()) return TTrackPoint();
|
|
|
7a5892 |
if (original.size() < 2) return original.front();
|
|
|
7a5892 |
TTrackPoint p0 = original.front();
|
|
|
7a5892 |
TTrackPoint p1 = original.back();
|
|
|
7a5892 |
if (fixAngle) calcFixedAngle(p0, p1);
|
|
|
7a5892 |
return TTrack::interpolationLinear(p0, p1, originalIndex/(original.size() - 1));
|
|
|
7a5892 |
}
|
|
|
7a5892 |
|
|
|
7a5892 |
void
|
|
|
7a5892 |
TModifierLine::modifyTrack(
|
|
|
7a5892 |
const TTrack &track,
|
|
|
7a5892 |
const TInputSavePoint::Holder &savePoint,
|
|
|
7a5892 |
TTrackList &outTracks )
|
|
|
7a5892 |
{
|
|
|
7a5892 |
if (!track.handler) {
|
|
|
7a5892 |
track.handler = new TTrackHandler(track);
|
|
|
7a5892 |
Modifier *modifier = new Modifier(*track.handler);
|
|
|
7a5892 |
modifier->savePoint = savePoint;
|
|
|
7a5892 |
track.handler->tracks.push_back( new TTrack(modifier) );
|
|
|
7a5892 |
}
|
|
|
7a5892 |
|
|
|
7a5892 |
if (!track.changed())
|
|
|
7a5892 |
return;
|
|
|
7a5892 |
if (track.handler->tracks.empty())
|
|
|
7a5892 |
return;
|
|
|
7a5892 |
|
|
|
7a5892 |
TTrack &subTrack = *track.handler->tracks.front();
|
|
|
7a5892 |
Modifier* modifier = dynamic_cast<modifier*>(subTrack.modifier.getPointer());</modifier*>
|
|
|
7a5892 |
if (!modifier)
|
|
|
7a5892 |
{ track.resetChanges(); return; }
|
|
|
7a5892 |
|
|
|
7a5892 |
bool fixAngle = track.getKeyState(track.back()).isPressed(TKey::shift);
|
|
|
7a5892 |
outTracks.push_back(track.handler->tracks.front());
|
|
|
7a5892 |
|
|
|
7a5892 |
int i1 = track.size();
|
|
|
7a5892 |
int i0 = i1 - track.pointsAdded;
|
|
|
7a5892 |
double maxPressure = modifier->maxPressure;
|
|
|
7a5892 |
if (track.pointsRemoved)
|
|
|
7a5892 |
{ maxPressure = 0; i0 = 0; }
|
|
|
7a5892 |
for(int i = i0; i < i1; ++i) {
|
|
|
7a5892 |
double p = track[i].pressure;
|
|
|
7a5892 |
if (maxPressure < p) maxPressure = p;
|
|
|
7a5892 |
}
|
|
|
7a5892 |
modifier->maxPressure = maxPressure;
|
|
|
7a5892 |
modifier->fixAngle = fixAngle;
|
|
|
7a5892 |
if (track.finished())
|
|
|
7a5892 |
modifier->savePoint.reset();
|
|
|
7a5892 |
|
|
|
7a5892 |
subTrack.truncate(0);
|
|
|
7a5892 |
|
|
|
7a5892 |
if (track.size() > 0) {
|
|
|
7a5892 |
TTrackPoint p = track.front();
|
|
|
7a5892 |
p.originalIndex = 0;
|
|
|
7a5892 |
p.pressure = maxPressure;
|
|
|
7a5892 |
p.tilt = TPointD();
|
|
|
7a5892 |
subTrack.push_back(p);
|
|
|
7a5892 |
}
|
|
|
7a5892 |
|
|
|
7a5892 |
if (track.size() > 1) {
|
|
|
7a5892 |
TTrackPoint p = track.back();
|
|
|
7a5892 |
p.originalIndex = track.size() - 1;
|
|
|
7a5892 |
p.pressure = maxPressure;
|
|
|
7a5892 |
p.tilt = TPointD();
|
|
|
7a5892 |
if (fixAngle) calcFixedAngle(subTrack.front(), p);
|
|
|
7a5892 |
subTrack.push_back(p);
|
|
|
7a5892 |
}
|
|
|
7a5892 |
|
|
|
7a5892 |
track.resetChanges();
|
|
|
7a5892 |
}
|