예제 #1
0
TArray<FString> UCurveBase::CreateCurveFromCSVString(const FString& InString)
{
	// Array used to store problems about curve import
	TArray<FString> OutProblems;

	TArray<FRichCurveEditInfo> Curves = GetCurves();
	const int32 NumCurves = Curves.Num();

	const FCsvParser Parser(InString);
	const FCsvParser::FRows& Rows = Parser.GetRows();

	if(Rows.Num() == 0)
	{
		OutProblems.Add(FString(TEXT("No data.")));
		return OutProblems;
	}

	// First clear out old data.
	ResetCurve();

	// Each row represents a point
	for(int32 RowIdx=0; RowIdx<Rows.Num(); RowIdx++)
	{
		const TArray<const TCHAR*>& Cells = Rows[RowIdx];
		const int32 NumCells = Cells.Num();

		// Need at least two cell, Time and one Value
		if(NumCells < 2)
		{
			OutProblems.Add(FString::Printf(TEXT("Row '%d' has less than 2 cells."), RowIdx));
			continue;
		}

		float Time = FCString::Atof(Cells[0]);
		for(int32 CellIdx=1; CellIdx<NumCells && CellIdx<(NumCurves+1); CellIdx++)
		{
			FRichCurve* Curve = Curves[CellIdx-1].CurveToEdit;
			if(Curve != NULL)
			{
				FKeyHandle KeyHandle = Curve->AddKey(Time, FCString::Atof(Cells[CellIdx]));
				Curve->SetKeyInterpMode(KeyHandle, RCIM_Linear);
			}
		}

		// If we get more cells than curves (+1 for time cell)
		if(NumCells > (NumCurves + 1))
		{
			OutProblems.Add(FString::Printf(TEXT("Row '%d' has too many cells for the curve(s)."), RowIdx));
		}
		// If we got too few cells
		else if(NumCells < (NumCurves + 1))
		{
			OutProblems.Add(FString::Printf(TEXT("Row '%d' has too few cells for the curve(s)."), RowIdx));
		}
	}

	Modify(true);

	return OutProblems;
}
예제 #2
0
void MixerCurve::setMixerType(MixerCurveType curveType)
{
    m_curveType = curveType;

    m_mixerUI->CurveMin->setMaximum(1.0);
    m_mixerUI->CurveMax->setMaximum(1.0);

    switch (m_curveType) {
    case MixerCurve::MIXERCURVE_THROTTLE:
    {
        m_mixerUI->SettingsGroup->setTitle("Throttle Curve");
        m_curve->setRange(0.0, 1.0);
        m_mixerUI->CurveMin->setMinimum(0.0);
        m_mixerUI->CurveMax->setMinimum(0.0);
        break;
    }
    case MixerCurve::MIXERCURVE_PITCH:
    {
        m_mixerUI->SettingsGroup->setTitle("Pitch Curve");
        m_curve->setRange(-1.0, 1.0);
        m_mixerUI->CurveMin->setMinimum(-1.0);
        m_mixerUI->CurveMax->setMinimum(-1.0);
        break;
    }
    }

    m_spinDelegate->setRange(m_mixerUI->CurveMin->minimum(), m_mixerUI->CurveMax->maximum());
    for (int i = 0; i < MixerCurveWidget::NODE_NUMELEM; i++) {
        m_settings->setItemDelegateForRow(i, m_spinDelegate);
    }

    ResetCurve();
}
예제 #3
0
MixerCurve::MixerCurve(QWidget *parent) :
    QFrame(parent),
    m_mixerUI(new Ui::MixerCurve)
{
    m_mixerUI->setupUi(this);

    // setup some convienence pointers
    m_curve    = m_mixerUI->CurveWidget;
    m_settings = m_mixerUI->CurveSettings;


    m_mixerUI->SettingsGroup->hide();

    // create our spin delegate
    m_spinDelegate = new DoubleSpinDelegate();

    // set the default mixer type
    setMixerType(MixerCurve::MIXERCURVE_THROTTLE);

    // paint the ui
    UpdateCurveUI();

    // wire up our signals
    connect(m_mixerUI->CurveType, SIGNAL(currentIndexChanged(int)), this, SLOT(CurveTypeChanged()));
    connect(m_mixerUI->ResetCurve, SIGNAL(clicked()), this, SLOT(ResetCurve()));
    connect(m_mixerUI->PopupCurve, SIGNAL(clicked()), this, SLOT(PopupCurve()));
    connect(m_mixerUI->GenerateCurve, SIGNAL(clicked()), this, SLOT(GenerateCurve()));
    connect(m_curve, SIGNAL(curveUpdated()), this, SLOT(UpdateSettingsTable()));
    connect(m_settings, SIGNAL(cellChanged(int, int)), this, SLOT(SettingsTableChanged()));
    connect(m_mixerUI->CurveMin, SIGNAL(valueChanged(double)), this, SLOT(CurveMinChanged(double)));
    connect(m_mixerUI->CurveMax, SIGNAL(valueChanged(double)), this, SLOT(CurveMaxChanged(double)));
    connect(m_mixerUI->CurveStep, SIGNAL(valueChanged(double)), this, SLOT(GenerateCurve()));
}
예제 #4
0
void MixerCurve::CommandActivated(MixerNode* node)
{
    QString name = (node) ? node->getName() : "Reset";

    if (name == "Reset") {        
        ResetCurve();
        m_curve->showCommands(false);
    }
    else if (name == "Commands") {

    }
    else if (name == "Popup" ) {
        PopupCurve();
    }
    else if (name == "Linear") {
        m_mixerUI->CurveType->setCurrentIndex(m_mixerUI->CurveType->findText("Linear"));
    }
    else if (name == "Log") {
        m_mixerUI->CurveType->setCurrentIndex(m_mixerUI->CurveType->findText("Log"));
    }
    else if (name == "Exp") {
        m_mixerUI->CurveType->setCurrentIndex(m_mixerUI->CurveType->findText("Exp"));
    }
    else if (name == "Flat") {
        m_mixerUI->CurveType->setCurrentIndex(m_mixerUI->CurveType->findText("Flat"));
    }
    else if (name == "Step") {
        m_mixerUI->CurveType->setCurrentIndex(m_mixerUI->CurveType->findText("Step"));
    }
    else if (name ==  "MinPlus") {
        m_mixerUI->CurveMin->stepUp();
    }
    else if (name ==  "MinMinus") {
        m_mixerUI->CurveMin->stepDown();
    }
    else if (name == "MaxPlus") {
        m_mixerUI->CurveMax->stepUp();
    }
    else if (name == "MaxMinus"){
        m_mixerUI->CurveMax->stepDown();
    }
    else if (name ==  "StepPlus") {
        m_mixerUI->CurveStep->stepUp();
        m_curve->setCommandText("StepValue", QString("%0").arg(getCurveStep()));
    }
    else if (name == "StepMinus") {
        m_mixerUI->CurveStep->stepDown();
        m_curve->setCommandText("StepValue", QString("%0").arg(getCurveStep()));
    }

    GenerateCurve();
}
예제 #5
0
MixerCurve::MixerCurve(QWidget *parent) :
    QFrame(parent),
    m_mixerUI(new Ui::MixerCurvePlot)
{
    m_mixerUI->setupUi(this);

    // setup some convienence pointers
    m_curve = m_mixerUI->CurveWidget;
    m_settings = m_mixerUI->CurveSettings;

    // by default mixcurve isn't used for curve2source
    m_mixerUI->CBCurve2Source->hide();

    m_mixerUI->SettingsGroup->hide();
    m_curve->showCommands(false);
    m_curve->showCommand("Reset", false);
    m_curve->showCommand("Popup", false);
    m_curve->showCommand("Commands", false);

    // create our spin delegate
    m_spinDelegate = new DoubleSpinDelegate();

    // set the default mixer type
    setMixerType(MixerCurve::MIXERCURVE_THROTTLE);

    // setup and turn off advanced mode
    CommandActivated();

    // paint the ui
    UpdateCurveUI();

    // wire up our signals

    connect(m_mixerUI->CurveType, SIGNAL(currentIndexChanged(int)), this, SLOT(CurveTypeChanged()));
    connect(m_mixerUI->ResetCurve, SIGNAL(clicked()), this, SLOT(ResetCurve()));
    connect(m_mixerUI->PopupCurve, SIGNAL(clicked()),this,SLOT(PopupCurve()));
    connect(m_mixerUI->GenerateCurve, SIGNAL(clicked()), this, SLOT(GenerateCurve()));
    connect(m_curve, SIGNAL(curveUpdated()), this, SLOT(UpdateSettingsTable()));
    connect(m_curve, SIGNAL(commandActivated(MixerNode*)),this, SLOT(CommandActivated(MixerNode*)));
    connect(m_settings, SIGNAL(cellChanged(int,int)), this, SLOT(SettingsTableChanged()));
    connect(m_mixerUI->CurveMin, SIGNAL(valueChanged(double)), this, SLOT(CurveMinChanged(double)));
    connect(m_mixerUI->CurveMax, SIGNAL(valueChanged(double)), this, SLOT(CurveMaxChanged(double)));
    connect(m_mixerUI->CurveStep, SIGNAL(valueChanged(double)), this, SLOT(GenerateCurve()));



}
예제 #6
0
void MixerCurve::setMixerType(MixerCurveType curveType, bool isCurve1)
{
    m_curveType = curveType;

    m_mixerUI->CurveMin->setMaximum(1.0);
    m_mixerUI->CurveMax->setMaximum(1.0);

    switch (m_curveType) {
        case MixerCurve::MIXERCURVE_THROTTLE:
        {
            m_mixerUI->SettingsGroup->setTitle("Throttle Curve");
            m_curve->setRange(0.0, 1.0);
            m_mixerUI->CurveMin->setMinimum(0.0);
            m_mixerUI->CurveMax->setMinimum(0.0);
            break;
        }
        case MixerCurve::MIXERCURVE_OTHER:
        {
            m_mixerUI->SettingsGroup->setTitle("Pitch Curve");
            m_curve->setRange(-1.0, 1.0);            
            m_curve->setPositiveColor("#0000aa", "#0000aa");
            m_mixerUI->CurveMin->setMinimum(-1.0);
            m_mixerUI->CurveMax->setMinimum(-1.0);
            break;
        }
    }

    if(!isCurve1){
        m_mixerUI->CBCurve2Source->show();
        m_mixerUI->inputLabelCurve2Source->setText("Input:");
    }else{
        m_mixerUI->inputLabelCurve2Source->setText("Input: Throttle");
    }

    m_spinDelegate->setRange(m_mixerUI->CurveMin->minimum(), m_mixerUI->CurveMax->maximum());
    for (int i=0; i<MixerCurveWidget::NODE_NUMELEM; i++) {
        m_settings->setItemDelegateForRow(i, m_spinDelegate);
    }

    ResetCurve();
}