mirror of
				https://bitbucket.org/mfeemster/fractorium.git
				synced 2025-11-03 17:50:27 -05:00 
			
		
		
		
	--User changes
-Allow for specifying linear or smooth interpolation when generating a sequence in the Library tab (was formerly hardcoded to smooth). This has the effect of exposing the --unsmoother option used in EmberGenome in the GUI. -Clarify tool tips of the sequence interpolation fields in the animation group on the Flame tab. -Change caption of the Bounds tab to be Bounds & Log.
This commit is contained in:
		@ -1,4 +1,4 @@
 | 
				
			|||||||
1.0.0.21 4/11/2020
 | 
					1.0.0.20 4/11/2020
 | 
				
			||||||
--Bug fixes
 | 
					--Bug fixes
 | 
				
			||||||
 -ETA time was wrong with incremental final renders after waiting for a period of time.
 | 
					 -ETA time was wrong with incremental final renders after waiting for a period of time.
 | 
				
			||||||
 -Fix possible OpenCL bugs in cubic3D, cubicLattice_3D, dc_cube, falloff, falloff2, falloff3, waffle.
 | 
					 -Fix possible OpenCL bugs in cubic3D, cubicLattice_3D, dc_cube, falloff, falloff2, falloff3, waffle.
 | 
				
			||||||
 | 
				
			|||||||
@ -922,7 +922,7 @@ public:
 | 
				
			|||||||
				vector<v2T> cxTrn(size);
 | 
									vector<v2T> cxTrn(size);
 | 
				
			||||||
				thisXform->m_Affine.m_Mat = m23T(0);
 | 
									thisXform->m_Affine.m_Mat = m23T(0);
 | 
				
			||||||
				//Affine part.
 | 
									//Affine part.
 | 
				
			||||||
				Interpolater<T>::ConvertLinearToPolar(embers, size, i, 0, cxAng, cxMag, cxTrn);
 | 
									Interpolater<T>::ConvertLinearToPolar(embers, size, i, false, cxAng, cxMag, cxTrn);
 | 
				
			||||||
				Interpolater<T>::InterpAndConvertBack(coefs, cxAng, cxMag, cxTrn, thisXform->m_Affine);
 | 
									Interpolater<T>::InterpAndConvertBack(coefs, cxAng, cxMag, cxTrn, thisXform->m_Affine);
 | 
				
			||||||
				//Post part.
 | 
									//Post part.
 | 
				
			||||||
				allID = true;
 | 
									allID = true;
 | 
				
			||||||
@ -945,7 +945,7 @@ public:
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
				else
 | 
									else
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					Interpolater<T>::ConvertLinearToPolar(embers, size, i, 1, cxAng, cxMag, cxTrn);
 | 
										Interpolater<T>::ConvertLinearToPolar(embers, size, i, true, cxAng, cxMag, cxTrn);
 | 
				
			||||||
					Interpolater<T>::InterpAndConvertBack(coefs, cxAng, cxMag, cxTrn, thisXform->m_Post);
 | 
										Interpolater<T>::InterpAndConvertBack(coefs, cxAng, cxMag, cxTrn, thisXform->m_Post);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
				
			|||||||
@ -667,13 +667,13 @@ public:
 | 
				
			|||||||
	/// </summary>
 | 
						/// </summary>
 | 
				
			||||||
	/// <param name="embers">The vector of embers whose affine transforms will be copied and converted</param>
 | 
						/// <param name="embers">The vector of embers whose affine transforms will be copied and converted</param>
 | 
				
			||||||
	/// <param name="xfi">The xform index in each ember to convert</param>
 | 
						/// <param name="xfi">The xform index in each ember to convert</param>
 | 
				
			||||||
	/// <param name="cflag">If 0 convert pre affine, else post affine.</param>
 | 
						/// <param name="post">True to convert post affine, else convert pre affine.</param>
 | 
				
			||||||
	/// <param name="cxAng">The vec2 vector to store the polar angular values</param>
 | 
						/// <param name="cxAng">The vec2 vector to store the polar angular values</param>
 | 
				
			||||||
	/// <param name="cxMag">The vec2 vector to store the polar magnitude values</param>
 | 
						/// <param name="cxMag">The vec2 vector to store the polar magnitude values</param>
 | 
				
			||||||
	/// <param name="cxTrn">The vec2 vector to store the polar translation values</param>
 | 
						/// <param name="cxTrn">The vec2 vector to store the polar translation values</param>
 | 
				
			||||||
	static void ConvertLinearToPolar(const vector<Ember<T>>& embers, size_t xfi, size_t cflag, vector<v2T>& cxAng, vector<v2T>& cxMag, vector<v2T>& cxTrn)
 | 
						static void ConvertLinearToPolar(const vector<Ember<T>>& embers, size_t xfi, bool post, vector<v2T>& cxAng, vector<v2T>& cxMag, vector<v2T>& cxTrn)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		ConvertLinearToPolar(embers.data(), embers.size(), xfi, cflag, cxAng, cxMag, cxTrn);
 | 
							ConvertLinearToPolar(embers.data(), embers.size(), xfi, post, cxAng, cxMag, cxTrn);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
@ -683,11 +683,11 @@ public:
 | 
				
			|||||||
	/// <param name="embers">The array of embers whose affine transforms will be copied and converted</param>
 | 
						/// <param name="embers">The array of embers whose affine transforms will be copied and converted</param>
 | 
				
			||||||
	/// <param name="size">The size of the embers array</param>
 | 
						/// <param name="size">The size of the embers array</param>
 | 
				
			||||||
	/// <param name="xfi">The xform index in each ember to convert</param>
 | 
						/// <param name="xfi">The xform index in each ember to convert</param>
 | 
				
			||||||
	/// <param name="cflag">If 0 convert pre affine, else post affine.</param>
 | 
						/// <param name="post">True to convert post affine, else convert pre affine.</param>
 | 
				
			||||||
	/// <param name="cxAng">The vec2 vector to store the polar angular values</param>
 | 
						/// <param name="cxAng">The vec2 vector to store the polar angular values</param>
 | 
				
			||||||
	/// <param name="cxMag">The vec2 vector to store the polar magnitude values</param>
 | 
						/// <param name="cxMag">The vec2 vector to store the polar magnitude values</param>
 | 
				
			||||||
	/// <param name="cxTrn">The vec2 vector to store the polar translation values</param>
 | 
						/// <param name="cxTrn">The vec2 vector to store the polar translation values</param>
 | 
				
			||||||
	static void ConvertLinearToPolar(const Ember<T>* embers, size_t size, size_t xfi, size_t cflag, vector<v2T>& cxAng, vector<v2T>& cxMag, vector<v2T>& cxTrn)
 | 
						static void ConvertLinearToPolar(const Ember<T>* embers, size_t size, size_t xfi, bool post, vector<v2T>& cxAng, vector<v2T>& cxMag, vector<v2T>& cxTrn)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		const auto LOCALEPS = T(1e-10);//Even though EPS is defined elsewhere, need this here for full compatibility with flam3.
 | 
							const auto LOCALEPS = T(1e-10);//Even though EPS is defined elsewhere, need this here for full compatibility with flam3.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -710,7 +710,7 @@ public:
 | 
				
			|||||||
				{
 | 
									{
 | 
				
			||||||
					for (col = 0; col < 2; col++)
 | 
										for (col = 0; col < 2; col++)
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
						if (cflag == 0)
 | 
											if (!post)
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							c1[0] = xform->m_Affine.m_Mat[0][col];//a or b.
 | 
												c1[0] = xform->m_Affine.m_Mat[0][col];//a or b.
 | 
				
			||||||
							c1[1] = xform->m_Affine.m_Mat[1][col];//d or e.
 | 
												c1[1] = xform->m_Affine.m_Mat[1][col];//d or e.
 | 
				
			||||||
@ -752,7 +752,7 @@ public:
 | 
				
			|||||||
					if (auto xform = embers[k].GetTotalXform(xfi))
 | 
										if (auto xform = embers[k].GetTotalXform(xfi))
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
						//Adjust angles differently if an asymmetric case.
 | 
											//Adjust angles differently if an asymmetric case.
 | 
				
			||||||
						if (xform->m_Wind[col] > 0 && cflag == 0)
 | 
											if (xform->m_Wind[col] > 0 && !post)
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							//Adjust the angles to make sure that it's within wind : wind + 2pi.
 | 
												//Adjust the angles to make sure that it's within wind : wind + 2pi.
 | 
				
			||||||
							refang = xform->m_Wind[col] - M_2PI;
 | 
												refang = xform->m_Wind[col] - M_2PI;
 | 
				
			||||||
@ -880,7 +880,6 @@ public:
 | 
				
			|||||||
				else
 | 
									else
 | 
				
			||||||
					accmag[col] += coefs[i] * (cxMag[i][col]);
 | 
										accmag[col] += coefs[i] * (cxMag[i][col]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				//Translation is ready to go.
 | 
					 | 
				
			||||||
				store.m_Mat[col][2] += coefs[i] * cxTrn[i][col];
 | 
									store.m_Mat[col][2] += coefs[i] * cxTrn[i][col];
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
				
			|||||||
@ -419,8 +419,8 @@ public:
 | 
				
			|||||||
		INITDOUBLEOPTION(BlackThresh,  Eod(eOptionUse::OPT_USE_GENOME,  eOptionIDs::OPT_BLACK_THRESH,     _T("--black"),                0.01,                 SO_REQ_SEP,  "   --black=<val>             Minimum number of allowed black pixels as a percentage from 0 - 1. Ignored if sequence, inter or rotate were specified [default: 0.01].\n"));
 | 
							INITDOUBLEOPTION(BlackThresh,  Eod(eOptionUse::OPT_USE_GENOME,  eOptionIDs::OPT_BLACK_THRESH,     _T("--black"),                0.01,                 SO_REQ_SEP,  "   --black=<val>             Minimum number of allowed black pixels as a percentage from 0 - 1. Ignored if sequence, inter or rotate were specified [default: 0.01].\n"));
 | 
				
			||||||
		INITDOUBLEOPTION(WhiteLimit,   Eod(eOptionUse::OPT_USE_GENOME,  eOptionIDs::OPT_WHITE_LIMIT,      _T("--white"),                0.05,                 SO_REQ_SEP,  "   --white=<val>             Maximum number of allowed white pixels as a percentage from 0 - 1. Ignored if sequence, inter or rotate were specified [default: 0.05].\n"));
 | 
							INITDOUBLEOPTION(WhiteLimit,   Eod(eOptionUse::OPT_USE_GENOME,  eOptionIDs::OPT_WHITE_LIMIT,      _T("--white"),                0.05,                 SO_REQ_SEP,  "   --white=<val>             Maximum number of allowed white pixels as a percentage from 0 - 1. Ignored if sequence, inter or rotate were specified [default: 0.05].\n"));
 | 
				
			||||||
		INITDOUBLEOPTION(Speed,        Eod(eOptionUse::OPT_USE_GENOME,  eOptionIDs::OPT_SPEED,            _T("--speed"),                0.1,                  SO_REQ_SEP,  "   --speed=<val>             Speed as a percentage from 0 - 1 that the affine transform of an existing flame mutates with the new flame. Ignored if sequence, inter or rotate were specified [default: 0.1].\n"));
 | 
							INITDOUBLEOPTION(Speed,        Eod(eOptionUse::OPT_USE_GENOME,  eOptionIDs::OPT_SPEED,            _T("--speed"),                0.1,                  SO_REQ_SEP,  "   --speed=<val>             Speed as a percentage from 0 - 1 that the affine transform of an existing flame mutates with the new flame. Ignored if sequence, inter or rotate were specified [default: 0.1].\n"));
 | 
				
			||||||
		INITDOUBLEOPTION(OffsetX,      Eod(eOptionUse::OPT_USE_GENOME,  eOptionIDs::OPT_OFFSETX,          _T("--offsetx"),              0.0,                  SO_REQ_SEP,  "   --offsetx=<val>           Amount to jitter each flame horizontally when applying genome tools [default: 0].\n"));
 | 
							INITDOUBLEOPTION(OffsetX,      Eod(eOptionUse::OPT_USE_GENOME,  eOptionIDs::OPT_OFFSETX,          _T("--offsetx"),              0.0,                  SO_REQ_SEP,  "   --offsetx=<val>           Amount to move each flame horizontally when applying genome tools [default: 0].\n"));
 | 
				
			||||||
		INITDOUBLEOPTION(OffsetY,      Eod(eOptionUse::OPT_USE_GENOME,  eOptionIDs::OPT_OFFSETY,          _T("--offsety"),              0.0,                  SO_REQ_SEP,  "   --offsety=<val>           Amount to jitter each flame vertically when applying genome tools [default: 0].\n"));
 | 
							INITDOUBLEOPTION(OffsetY,      Eod(eOptionUse::OPT_USE_GENOME,  eOptionIDs::OPT_OFFSETY,          _T("--offsety"),              0.0,                  SO_REQ_SEP,  "   --offsety=<val>           Amount to move each flame vertically when applying genome tools [default: 0].\n"));
 | 
				
			||||||
		INITDOUBLEOPTION(UseMem,       Eod(eOptionUse::OPT_USE_RENDER,  eOptionIDs::OPT_USEMEM,           _T("--use_mem"),              0.0,                  SO_REQ_SEP,  "   --use_mem=<val>           Number of bytes of memory to use [default: max system memory].\n"));
 | 
							INITDOUBLEOPTION(UseMem,       Eod(eOptionUse::OPT_USE_RENDER,  eOptionIDs::OPT_USEMEM,           _T("--use_mem"),              0.0,                  SO_REQ_SEP,  "   --use_mem=<val>           Number of bytes of memory to use [default: max system memory].\n"));
 | 
				
			||||||
		INITDOUBLEOPTION(Loops,        Eod(eOptionUse::OPT_USE_GENOME,  eOptionIDs::OPT_LOOPS,            _T("--loops"),                1.0,                  SO_REQ_SEP,  "   --loops=<val>             Number of times to rotate each control point in sequence [default: 1].\n"));
 | 
							INITDOUBLEOPTION(Loops,        Eod(eOptionUse::OPT_USE_GENOME,  eOptionIDs::OPT_LOOPS,            _T("--loops"),                1.0,                  SO_REQ_SEP,  "   --loops=<val>             Number of times to rotate each control point in sequence [default: 1].\n"));
 | 
				
			||||||
		//String.
 | 
							//String.
 | 
				
			||||||
 | 
				
			|||||||
@ -435,7 +435,7 @@ bool Fractorium::eventFilter(QObject* o, QEvent* e)
 | 
				
			|||||||
					!focusedctrlCombo &&
 | 
										!focusedctrlCombo &&
 | 
				
			||||||
					!QGuiApplication::keyboardModifiers().testFlag(Qt::AltModifier))//Must exclude these because otherwise, typing a minus key in any of the spinners will switch the xform. Also exclude alt.
 | 
										!QGuiApplication::keyboardModifiers().testFlag(Qt::AltModifier))//Must exclude these because otherwise, typing a minus key in any of the spinners will switch the xform. Also exclude alt.
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				unsigned int index;
 | 
									size_t index;
 | 
				
			||||||
				double vdist = 0.01;
 | 
									double vdist = 0.01;
 | 
				
			||||||
				double hdist = 0.01;
 | 
									double hdist = 0.01;
 | 
				
			||||||
				double zoom = 1;
 | 
									double zoom = 1;
 | 
				
			||||||
@ -1233,6 +1233,7 @@ void Fractorium::SetTabOrders()
 | 
				
			|||||||
	w = SetTabOrder(this, w, ui.SequenceRotationsPerBlendSpinBox);
 | 
						w = SetTabOrder(this, w, ui.SequenceRotationsPerBlendSpinBox);
 | 
				
			||||||
	w = SetTabOrder(this, w, ui.SequenceRotationsPerBlendCWCheckBox);
 | 
						w = SetTabOrder(this, w, ui.SequenceRotationsPerBlendCWCheckBox);
 | 
				
			||||||
	w = SetTabOrder(this, w, ui.SequenceRotationsPerBlendMaxSpinBox);
 | 
						w = SetTabOrder(this, w, ui.SequenceRotationsPerBlendMaxSpinBox);
 | 
				
			||||||
 | 
						w = SetTabOrder(this, w, ui.SequenceLinearCheckBox);
 | 
				
			||||||
	w = SetTabOrder(this, w, ui.SequenceGenerateButton);
 | 
						w = SetTabOrder(this, w, ui.SequenceGenerateButton);
 | 
				
			||||||
	w = SetTabOrder(this, w, ui.SequenceRenderButton);
 | 
						w = SetTabOrder(this, w, ui.SequenceRenderButton);
 | 
				
			||||||
	w = SetTabOrder(this, w, ui.SequenceSaveButton);
 | 
						w = SetTabOrder(this, w, ui.SequenceSaveButton);
 | 
				
			||||||
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -61,6 +61,8 @@ void Fractorium::InitLibraryUI()
 | 
				
			|||||||
	ui.SequenceRotationsPerBlendSpinBox->setMaximum(std::numeric_limits<int>::max());//Lower max = upper.
 | 
						ui.SequenceRotationsPerBlendSpinBox->setMaximum(std::numeric_limits<int>::max());//Lower max = upper.
 | 
				
			||||||
	ui.SequenceRotationsPerBlendMaxSpinBox->setValue(m_Settings->RotationsPerBlendMax());//Upper.
 | 
						ui.SequenceRotationsPerBlendMaxSpinBox->setValue(m_Settings->RotationsPerBlendMax());//Upper.
 | 
				
			||||||
	ui.SequenceRotationsPerBlendMaxSpinBox->setMinimum(m_Settings->RotationsPerBlend());//Upper min = lower max.
 | 
						ui.SequenceRotationsPerBlendMaxSpinBox->setMinimum(m_Settings->RotationsPerBlend());//Upper min = lower max.
 | 
				
			||||||
 | 
						//Linear.
 | 
				
			||||||
 | 
						ui.SequenceLinearCheckBox->setChecked(m_Settings->Linear());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// <summary>
 | 
					/// <summary>
 | 
				
			||||||
@ -614,6 +616,7 @@ void FractoriumEmberController<T>::SequenceGenerateButtonClicked()
 | 
				
			|||||||
	const size_t start = ui.SequenceStartFlameSpinBox->value();
 | 
						const size_t start = ui.SequenceStartFlameSpinBox->value();
 | 
				
			||||||
	const size_t stop = ui.SequenceStopFlameSpinBox->value();
 | 
						const size_t stop = ui.SequenceStopFlameSpinBox->value();
 | 
				
			||||||
	const size_t startCount = ui.SequenceStartCountSpinBox->value();
 | 
						const size_t startCount = ui.SequenceStartCountSpinBox->value();
 | 
				
			||||||
 | 
						const bool linear = ui.SequenceLinearCheckBox->isChecked();
 | 
				
			||||||
	const size_t keyFrames = (stop - start) + 1;
 | 
						const size_t keyFrames = (stop - start) + 1;
 | 
				
			||||||
	size_t frameCount = 0;
 | 
						size_t frameCount = 0;
 | 
				
			||||||
	double frames = 0;
 | 
						double frames = 0;
 | 
				
			||||||
@ -647,7 +650,7 @@ void FractoriumEmberController<T>::SequenceGenerateButtonClicked()
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SheepTools<T, float> tools(palettePath, EmberCommon::CreateRenderer<T>(eRendererType::CPU_RENDERER, devices, false, 0, emberReport));
 | 
						SheepTools<T, float> tools(palettePath, EmberCommon::CreateRenderer<T>(eRendererType::CPU_RENDERER, devices, false, 0, emberReport));
 | 
				
			||||||
	tools.SetSpinParams(true,
 | 
						tools.SetSpinParams(!linear,
 | 
				
			||||||
						stagger,//Will be set again below if random is used.
 | 
											stagger,//Will be set again below if random is used.
 | 
				
			||||||
						0,
 | 
											0,
 | 
				
			||||||
						0,
 | 
											0,
 | 
				
			||||||
@ -918,6 +921,7 @@ void Fractorium::SyncSequenceSettings()
 | 
				
			|||||||
	m_Settings->BlendFramesMax(ui.SequenceRandomBlendMaxFramesSpinBox->value());
 | 
						m_Settings->BlendFramesMax(ui.SequenceRandomBlendMaxFramesSpinBox->value());
 | 
				
			||||||
	m_Settings->RotationsPerBlend(ui.SequenceRotationsPerBlendSpinBox->value());
 | 
						m_Settings->RotationsPerBlend(ui.SequenceRotationsPerBlendSpinBox->value());
 | 
				
			||||||
	m_Settings->RotationsPerBlendMax(ui.SequenceRotationsPerBlendMaxSpinBox->value());
 | 
						m_Settings->RotationsPerBlendMax(ui.SequenceRotationsPerBlendMaxSpinBox->value());
 | 
				
			||||||
 | 
						m_Settings->Linear(ui.SequenceLinearCheckBox->isChecked());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template class FractoriumEmberController<float>;
 | 
					template class FractoriumEmberController<float>;
 | 
				
			||||||
 | 
				
			|||||||
@ -239,6 +239,9 @@ void FractoriumSettings::RotationsPerBlend(uint i)    { setValue(ROTATIONSPERBLE
 | 
				
			|||||||
uint FractoriumSettings::RotationsPerBlendMax()       { return value(ROTATIONSPERBLENDMAX).toUInt(); }
 | 
					uint FractoriumSettings::RotationsPerBlendMax()       { return value(ROTATIONSPERBLENDMAX).toUInt(); }
 | 
				
			||||||
void FractoriumSettings::RotationsPerBlendMax(uint i) { setValue(ROTATIONSPERBLENDMAX, i);           }
 | 
					void FractoriumSettings::RotationsPerBlendMax(uint i) { setValue(ROTATIONSPERBLENDMAX, i);           }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool FractoriumSettings::Linear()                     { return value(LINEAR).toBool();               }
 | 
				
			||||||
 | 
					void FractoriumSettings::Linear(bool b)               { setValue(LINEAR, b);                         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// <summary>
 | 
					/// <summary>
 | 
				
			||||||
/// Variations filter settings.
 | 
					/// Variations filter settings.
 | 
				
			||||||
/// </summary>
 | 
					/// </summary>
 | 
				
			||||||
 | 
				
			|||||||
@ -42,6 +42,7 @@
 | 
				
			|||||||
#define BLENDFRAMESMAX		 "sequence/blendframesmax"
 | 
					#define BLENDFRAMESMAX		 "sequence/blendframesmax"
 | 
				
			||||||
#define ROTATIONSPERBLEND	 "sequence/rotationsperblend"
 | 
					#define ROTATIONSPERBLEND	 "sequence/rotationsperblend"
 | 
				
			||||||
#define ROTATIONSPERBLENDMAX "sequence/rotationsperblendmax"
 | 
					#define ROTATIONSPERBLENDMAX "sequence/rotationsperblendmax"
 | 
				
			||||||
 | 
					#define LINEAR				 "sequence/linear"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define VARFILTERSUM         "varfilter/sumcheckbox"
 | 
					#define VARFILTERSUM         "varfilter/sumcheckbox"
 | 
				
			||||||
#define VARFILTERASSIGN      "varfilter/assigncheckbox"
 | 
					#define VARFILTERASSIGN      "varfilter/assigncheckbox"
 | 
				
			||||||
@ -214,6 +215,9 @@ public:
 | 
				
			|||||||
	uint RotationsPerBlendMax();
 | 
						uint RotationsPerBlendMax();
 | 
				
			||||||
	void RotationsPerBlendMax(uint i);
 | 
						void RotationsPerBlendMax(uint i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool Linear();
 | 
				
			||||||
 | 
						void Linear(bool b);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int VarFilterSum();
 | 
						int VarFilterSum();
 | 
				
			||||||
	void VarFilterSum(int i);
 | 
						void VarFilterSum(int i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user