Use QPair<int, float> for control points instead of QVector<float>

This commit is contained in:
Hyunjin Song
2018-08-09 14:40:21 +09:00
parent 0dfdbc956a
commit 9c21d0b4d8
3 changed files with 49 additions and 51 deletions

View File

@@ -27,8 +27,9 @@
#ifndef AUTOMATION_PATTERN_H
#define AUTOMATION_PATTERN_H
#include <QtCore/QMap>
#include <QtCore/QPointer>
#include <QMap>
#include <QPair>
#include <QPointer>
#include "TrackContentObject.h"
@@ -51,7 +52,7 @@ public:
} ;
typedef QMap<int, float> timeMap;
typedef QMap<int, QVector<float> > controlPointTimeMap;
typedef QMap<int, QPair<int, float> > controlPointTimeMap;
typedef QVector<QPointer<AutomatableModel> > objectVector;
AutomationPattern( AutomationTrack * _auto_track );

View File

@@ -236,8 +236,7 @@ TimePos AutomationPattern::putControlPoint(timeMap::const_iterator it,
const int time, const float _value)
{
m_controlPoints.remove( it.key() );
m_controlPoints[it.key()].insert( 0, time );
m_controlPoints[it.key()].insert( 1, _value );
m_controlPoints[it.key()] = {time, _value};
clampControlPoints();
return it.key();
}
@@ -348,8 +347,8 @@ TimePos AutomationPattern::setDragValue( const TimePos & time,
if ( m_timeMap.contains( newTime ) )
{
// Set the offset for the control point, so it gets dragged around with the automation point
m_controlPointDragOffset[0] = (float)m_controlPoints[newTime][0] - (float)newTime;
m_controlPointDragOffset[1] = m_controlPoints[newTime][1] - m_timeMap[newTime];
m_controlPointDragOffset[0] = (float)m_controlPoints[newTime].first - (float)newTime;
m_controlPointDragOffset[1] = m_controlPoints[newTime].second - m_timeMap[newTime];
}
else
{
@@ -513,12 +512,12 @@ float AutomationPattern::valueAt( timeMap::const_iterator v, int offset ) const
// The x values are essentially twice the distance from their control points
// to make up for their range being limited.
int targetX1 = ( m_controlPoints[v.key()].at(0) - v.key() ) * 2;
int targetX2 = ( 3 * (v+1).key() - 2 * m_controlPoints[(v+1).key()].at(0) - v.key() );
int targetX1 = ( m_controlPoints[v.key()].first - v.key() ) * 2;
int targetX2 = ( 3 * (v+1).key() - 2 * m_controlPoints[(v+1).key()].first - v.key() );
// The y values are the actual y values. Maybe this should be doubled,
// but it doesn't seem necessary to me.
float targetY1 = m_controlPoints[v.key()].at(1);
float targetY2 = 2*(v+1).value() - m_controlPoints[(v+1).key()].at(1);
float targetY1 = m_controlPoints[v.key()].second;
float targetY2 = 2*(v+1).value() - m_controlPoints[(v+1).key()].second;
// To find the y value on the curve at a certain x, we first have to find the t (between 0 and 1) that gives the x
float t = 0;
@@ -589,15 +588,15 @@ void AutomationPattern::flipY( int min, int max )
{
tempValue = valueAt( ( iterate + i ).key() ) * -1;
putValue( TimePos( (iterate + i).key() ) , tempValue, false);
tempValue = m_controlPoints[(iterate + i).key()][1] * -1;
m_controlPoints[(iterate + i).key()][1] = tempValue;
tempValue = m_controlPoints[(iterate + i).key()].second * -1;
m_controlPoints[(iterate + i).key()].second = tempValue;
}
else
{
tempValue = max - valueAt( ( iterate + i ).key() );
putValue( TimePos( (iterate + i).key() ) , tempValue, false);
tempValue = max - m_controlPoints[(iterate + i).key()][1];
m_controlPoints[(iterate + i).key()][1] = tempValue;
tempValue = max - m_controlPoints[(iterate + i).key()].second;
m_controlPoints[(iterate + i).key()].second = tempValue;
}
}
@@ -644,9 +643,9 @@ void AutomationPattern::flipX( int length )
tempValue = valueAt( ( iterate + i ).key() );
TimePos newTime = TimePos( length - ( iterate + i ).key() );
int newControlPointX = -( iterate + i ).key() + m_controlPoints[( iterate + i ).key()][0] + newTime;
tempControlPoints[newTime].insert( 0, newControlPointX );
tempControlPoints[newTime].insert( 1, 2*tempValue - m_controlPoints[( iterate + i ).key()][1] );
int newControlPointX = -( iterate + i ).key() + m_controlPoints[( iterate + i ).key()].first + newTime;
tempControlPoints[newTime] = {newControlPointX,
2*tempValue - m_controlPoints[( iterate + i ).key()].second};
tempMap[newTime] = tempValue;
}
@@ -658,9 +657,9 @@ void AutomationPattern::flipX( int length )
tempValue = valueAt( ( iterate + i ).key() );
TimePos newTime;
int newControlPointX = -( iterate + i ).key() + m_controlPoints[( iterate + i ).key()][0] + newTime;
tempControlPoints[newTime].insert( 0, newControlPointX );
tempControlPoints[newTime].insert( 1, 2*tempValue - m_controlPoints[( iterate + i ).key()][1] );
int newControlPointX = -( iterate + i ).key() + m_controlPoints[( iterate + i ).key()].first + newTime;
tempControlPoints[newTime] = {newControlPointX,
2*tempValue - m_controlPoints[( iterate + i ).key()].second};
if ( ( iterate + i ).key() <= length )
{
@@ -681,11 +680,11 @@ void AutomationPattern::flipX( int length )
tempValue = valueAt( ( iterate + i ).key() );
cleanObjects();
TimePos newTime = TimePos( realLength - ( iterate + i ).key() );
int newControlPointX = -( iterate + i ).key() + m_controlPoints[( iterate + i ).key()][0] + newTime;
int newControlPointX = -( iterate + i ).key() + m_controlPoints[( iterate + i ).key()].first + newTime;
tempMap[newTime] = tempValue;
tempControlPoints[newTime].insert( 0, newControlPointX );
tempControlPoints[newTime].insert( 1, 2*tempValue - m_controlPoints[( iterate + i ).key()][1] );
tempControlPoints[newTime] = {newControlPointX,
2*tempValue - m_controlPoints[( iterate + i ).key()].second};
}
}
@@ -730,8 +729,8 @@ void AutomationPattern::saveSettings( QDomDocument & _doc, QDomElement & _this )
{
QDomElement element = _doc.createElement( "ctrlpnt" );
element.setAttribute( "pos", it.key() );
element.setAttribute( "value1", it.value()[0] );
element.setAttribute( "value2", it.value()[1] );
element.setAttribute( "value1", it.value().first );
element.setAttribute( "value2", it.value().second );
_this.appendChild( element );
}
@@ -777,8 +776,8 @@ void AutomationPattern::loadSettings( const QDomElement & _this )
}
else if( element.tagName() == "ctrlpnt" )
{
m_controlPoints[element.attribute( "pos" ).toInt()].insert( 0, element.attribute( "value1" ).toInt() );
m_controlPoints[element.attribute( "pos" ).toInt()].insert( 1, element.attribute( "value2" ).toFloat() );
m_controlPoints[element.attribute( "pos" ).toInt()] = {element.attribute( "value1" ).toInt(),
element.attribute( "value2" ).toFloat()};
}
else if( element.tagName() == "object" )
{
@@ -832,21 +831,21 @@ void AutomationPattern::clampControlPoints(bool clampVertical)
timeMap::const_iterator it;
for (it = m_timeMap.begin(); it != m_timeMap.end(); it++)
{
int new_x = m_controlPoints[it.key()][0];
float new_y = m_controlPoints[it.key()][1];
int new_x = m_controlPoints[it.key()].first;
float new_y = m_controlPoints[it.key()].second;
// Clamp X positions
// If the control point x is less than its automation point
if ( it.key() > m_controlPoints[it.key()][0] )
if ( it.key() > new_x )
{
new_x = it.key();
}
// The control point x must not pass the midpoints of its automation point and the automation points
// its left and right
else if ( it != m_timeMap.begin() && it.key() * 2 - m_controlPoints[it.key()][0] < ( (it-1).key() + it.key() ) / 2 )
else if ( it != m_timeMap.begin() && it.key() * 2 - new_x < ( (it-1).key() + it.key() ) / 2 )
{
new_x = it.key() * 2 - ( (it-1).key() + it.key() )/2;
}
else if ( it+1 != m_timeMap.end() && m_controlPoints[it.key()][0] > ( (it+1).key() + it.key() )/2 )
else if ( it+1 != m_timeMap.end() && new_x > ( (it+1).key() + it.key() )/2 )
{
new_x = ( (it+1).key() + it.key() )/2;
}
@@ -855,20 +854,20 @@ void AutomationPattern::clampControlPoints(bool clampVertical)
{
// Clamp y positions between the top and bottom of the screen
// Clamp the right control point (keep in mind the last control point isn't clamped)
if ( it+1 != m_timeMap.end() && m_controlPoints[it.key()][1] > getMax() )
if ( it+1 != m_timeMap.end() && new_y > getMax() )
{
new_y = getMax();
}
else if ( it+1 != m_timeMap.end() && m_controlPoints[it.key()][1] < getMin() )
else if ( it+1 != m_timeMap.end() && new_y < getMin() )
{
new_y = getMin();
}
// Clamp the left control point (keep in mind the first control point isn't clamped)
if ( it != m_timeMap.begin() && 2 * it.value() - m_controlPoints[it.key()][1] > getMax() )
if ( it != m_timeMap.begin() && 2 * it.value() - new_y > getMax() )
{
new_y = 2 * it.value() - getMax();
}
else if ( it != m_timeMap.begin() && 2 * it.value() - m_controlPoints[it.key()][1] < getMin() )
else if ( it != m_timeMap.begin() && 2 * it.value() - new_y < getMin() )
{
new_y = 2 * it.value() - getMin();
}
@@ -876,8 +875,7 @@ void AutomationPattern::clampControlPoints(bool clampVertical)
m_controlPoints.remove( it.key() );
m_controlPoints[it.key()].insert( 0, new_x );
m_controlPoints[it.key()].insert( 1, new_y );
m_controlPoints[it.key()] = {new_x, new_y};
}
}
@@ -1142,8 +1140,7 @@ void AutomationPattern::cleanControlPoints()
}
else
{
m_controlPoints[it.key()].insert( 0, it.key() + 50 );
m_controlPoints[it.key()].insert( 1, it.value() );
m_controlPoints[it.key()] = {it.key() + 50, it.value()};
}
}

View File

@@ -540,10 +540,10 @@ void AutomationEditor::mousePressEvent( QMouseEvent* mouseEvent )
if ( m_pattern->progressionType() == AutomationPattern::BezierProgression &&
mouseEvent->button() == Qt::LeftButton &&
m_editMode == DRAW &&
yCoordOfLevel(level) <= yCoordOfLevel(control_points[it.key()][1]) + 16 &&
yCoordOfLevel(level) >= yCoordOfLevel(control_points[it.key()][1]) - 16 &&
xCoordOfTick(pos_ticks) <= xCoordOfTick(control_points[it.key()][0]) + 16 &&
xCoordOfTick(pos_ticks) >= xCoordOfTick(control_points[it.key()][0]) - 16 )
yCoordOfLevel(level) <= yCoordOfLevel(control_points[it.key()].second) + 16 &&
yCoordOfLevel(level) >= yCoordOfLevel(control_points[it.key()].second) - 16 &&
xCoordOfTick(pos_ticks) <= xCoordOfTick(control_points[it.key()].first) + 16 &&
xCoordOfTick(pos_ticks) >= xCoordOfTick(control_points[it.key()].first) - 16 )
{
controlPoint = true;
m_pattern->flipControlPoint(false);
@@ -553,10 +553,10 @@ void AutomationEditor::mousePressEvent( QMouseEvent* mouseEvent )
else if ( m_pattern->progressionType() == AutomationPattern::BezierProgression &&
mouseEvent->button() == Qt::LeftButton &&
m_editMode == DRAW &&
yCoordOfLevel(level) <= yCoordOfLevel(2 * it.value() - control_points[it.key()][1]) + 16 &&
yCoordOfLevel(level) >= yCoordOfLevel(2 * it.value() - control_points[it.key()][1]) - 16 &&
xCoordOfTick(pos_ticks) <= xCoordOfTick(2 * it.key() - control_points[it.key()][0]) + 16 &&
xCoordOfTick(pos_ticks) >= xCoordOfTick(2 * it.key() - control_points[it.key()][0]) - 16 )
yCoordOfLevel(level) <= yCoordOfLevel(2 * it.value() - control_points[it.key()].second) + 16 &&
yCoordOfLevel(level) >= yCoordOfLevel(2 * it.value() - control_points[it.key()].second) - 16 &&
xCoordOfTick(pos_ticks) <= xCoordOfTick(2 * it.key() - control_points[it.key()].first) + 16 &&
xCoordOfTick(pos_ticks) >= xCoordOfTick(2 * it.key() - control_points[it.key()].first) - 16 )
{
controlPoint = true;
m_pattern->flipControlPoint(true);
@@ -1212,8 +1212,8 @@ inline void AutomationEditor::drawAutomationPoint( QPainter & p, timeMap::iterat
inline void AutomationEditor::drawControlPoint( QPainter & p, controlPointTimeMap::iterator it , float key_y )
{
// The x and y of the "real" point (to the right of the automation point)
int x = xCoordOfTick( it.value()[0] );
int y = yCoordOfLevel( it.value()[1] );
int x = xCoordOfTick( it.value().first );
int y = yCoordOfLevel( it.value().second );
// The x and y of the "fake" point (to the left of the automation point)
const int outerRadius = qBound( 2, ( m_ppb * AutomationPattern::quantization() ) / 576, 5 );
p.setPen( QPen( controlPointColor().lighter( 200 ) ) );