From a5d69c75a24b29cd52f6e73cbf0b328b8427f5bd Mon Sep 17 00:00:00 2001 From: mfeemster Date: Sat, 26 Jul 2014 17:26:15 -0700 Subject: [PATCH] 0.4.0.8 Beta 07/26/2014 0.4.0.8 Beta 07/26/2014 --Bug Fixes Fix falloff, falloff2, falloff3. --- .gitignore | 8 ++- Builds/MSVC/VS2010/Fractorium.sln | 1 + .../FractoriumInstaller.wixproj | 2 +- .../VS2010/FractoriumInstaller/Product.wxs | 4 +- Data/Version History.txt | 4 ++ Source/Ember/EmberDefines.h | 2 +- Source/Ember/Variations04.h | 14 +++-- Source/Ember/Variations05.h | 56 +++++++++--------- Source/EmberAnimate/EmberAnimate.rc | 8 +-- Source/EmberCL/EmberCLFunctions.h | 6 ++ Source/EmberGenome/EmberGenome.rc | 8 +-- Source/EmberRender/EmberRender.rc | 8 +-- Source/EmberTester/EmberTester.cpp | 15 +++++ Source/Fractorium/AboutDialog.ui | 2 +- Source/Fractorium/Fractorium.rc | Bin 4574 -> 4574 bytes Source/Fractorium/FractoriumParams.cpp | 10 ++-- 16 files changed, 93 insertions(+), 55 deletions(-) diff --git a/.gitignore b/.gitignore index 1090eec..a0d164f 100644 --- a/.gitignore +++ b/.gitignore @@ -29,4 +29,10 @@ *moc_* *GeneratedFiles* *.unsuccessfulbuild -*\Obj\* \ No newline at end of file +*\Obj\* +Builds/MSVC/VS2010/Obj/x64/Debug/EmberCL_manifest.rc +Builds/MSVC/VS2010/Obj/EmberTester/x64/Debug/EmberTester_manifest.rc +Builds/MSVC/VS2010/Obj/EmberRender/x64/Debug/EmberRender_manifest.rc +Builds/MSVC/VS2010/Obj/EmberGenome/x64/Debug/EmberGenome_manifest.rc +Builds/MSVC/VS2010/Obj/EmberAnimate/x64/Debug/EmberAnimate_manifest.rc +Builds/MSVC/VS2010/Obj/Ember/x64/Debug/Ember_manifest.rc \ No newline at end of file diff --git a/Builds/MSVC/VS2010/Fractorium.sln b/Builds/MSVC/VS2010/Fractorium.sln index f126860..9ca557c 100644 --- a/Builds/MSVC/VS2010/Fractorium.sln +++ b/Builds/MSVC/VS2010/Fractorium.sln @@ -579,6 +579,7 @@ Global {C8096C47-E358-438C-A520-146D46B0637D}.Release|Mixed Platforms.Build.0 = Release|x86 {C8096C47-E358-438C-A520-146D46B0637D}.Release|Win32.ActiveCfg = Release|x86 {C8096C47-E358-438C-A520-146D46B0637D}.Release|x64.ActiveCfg = Release|x64 + {C8096C47-E358-438C-A520-146D46B0637D}.Release|x64.Build.0 = Release|x64 {C8096C47-E358-438C-A520-146D46B0637D}.Release|x86.ActiveCfg = Release|x86 {C8096C47-E358-438C-A520-146D46B0637D}.Release|x86.Build.0 = Release|x86 {C8096C47-E358-438C-A520-146D46B0637D}.Release-MT|Mixed Platforms.ActiveCfg = Release|x86 diff --git a/Builds/MSVC/VS2010/FractoriumInstaller/FractoriumInstaller.wixproj b/Builds/MSVC/VS2010/FractoriumInstaller/FractoriumInstaller.wixproj index e8c2ec5..9902321 100644 --- a/Builds/MSVC/VS2010/FractoriumInstaller/FractoriumInstaller.wixproj +++ b/Builds/MSVC/VS2010/FractoriumInstaller/FractoriumInstaller.wixproj @@ -6,7 +6,7 @@ 3.7 {c8096c47-e358-438c-a520-146d46b0637d} 2.0 - Fractorium_Beta_0.4.0.7 + Fractorium_Beta_0.4.0.8 Package $(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets $(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets diff --git a/Builds/MSVC/VS2010/FractoriumInstaller/Product.wxs b/Builds/MSVC/VS2010/FractoriumInstaller/Product.wxs index 7ced111..d44f184 100644 --- a/Builds/MSVC/VS2010/FractoriumInstaller/Product.wxs +++ b/Builds/MSVC/VS2010/FractoriumInstaller/Product.wxs @@ -1,6 +1,6 @@ - + @@ -13,7 +13,7 @@ - + ::epsilon()//Apoplugin.h uses -20, but it's more mathematically correct to do it this way. #define ISAAC_SIZE 4 diff --git a/Source/Ember/Variations04.h b/Source/Ember/Variations04.h index e8086d5..6d5b71a 100644 --- a/Source/Ember/Variations04.h +++ b/Source/Ember/Variations04.h @@ -4211,8 +4211,6 @@ public: } } - helper.Out.x = 0;//Needed because of possible sum below. - helper.Out.y = 0; r = fabs(r0 - T(0.5)) * m_OneOverRmax; if (r < 1) @@ -4220,6 +4218,11 @@ public: helper.Out.x = m_Size * (x + Floor(helper.In.x)); helper.Out.y = m_Size * (y + Floor(helper.In.y)); } + else + { + helper.Out.x = 0;//Needed because of possible sum below. + helper.Out.y = 0; + } r = fabs(r1 - T(0.5)) * m_OneOverRmax; @@ -4346,8 +4349,6 @@ public: << "\t\t }\n" << "\t\t}\n" << "\n" - << "\t\tvOut.x = 0;\n" - << "\t\tvOut.y = 0;\n" << "\t\tr = fabs(r0 - 0.5) * " << oneOverRmax << ";\n" << "\n" << "\t\tif (r < 1)\n" @@ -4355,6 +4356,11 @@ public: << "\t\t vOut.x = " << size << " * (x + floor(vIn.x));\n" << "\t\t vOut.y = " << size << " * (y + floor(vIn.y));\n" << "\t\t}\n" + << "\t\telse\n" + << "\t\t{\n" + << "\t\t vOut.x = 0.0;\n" + << "\t\t vOut.y = 0.0;\n" + << "\t\t}\n" << "\n" << "\t\tr = fabs(r1 - 0.5) * " << oneOverRmax << ";\n" << "\n" diff --git a/Source/Ember/Variations05.h b/Source/Ember/Variations05.h index fe31342..c4d84e1 100644 --- a/Source/Ember/Variations05.h +++ b/Source/Ember/Variations05.h @@ -2117,12 +2117,12 @@ public: void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) { - const T ax = rand.Frand11(); - const T ay = rand.Frand11(); - const T az = rand.Frand11(); + const T ax = rand.Frand(T(-0.5), T(0.5)); + const T ay = rand.Frand(T(-0.5), T(0.5)); + const T az = rand.Frand(T(-0.5), T(0.5)); const T r = sqrt(Sqr(helper.In.x - m_X0) + Sqr(helper.In.y - m_Y0) + Sqr(helper.In.z - m_Z0)); - const T rc = ((m_Invert != 0 ? min(1 - r, 0) : min(r, 0)) - m_MinDist) * m_InternalScatter; - const T rs = min(rc, 0); + const T rc = ((m_Invert != 0 ? max(1 - r, 0) : max(r, 0)) - m_MinDist) * m_InternalScatter;//Original called a macro named min, which internally performed max. + const T rs = max(rc, 0); T sigma, phi, rad, sigmas, sigmac, phis, phic; T scale, denom; @@ -2178,12 +2178,12 @@ public: string internalScatter = "parVars[" + ToUpper(m_Params[i++].Name()) + index; ss << "\t{\n" - << "\t\tconst real_t ax = MwcNextNeg1Pos1(mwc);\n" - << "\t\tconst real_t ay = MwcNextNeg1Pos1(mwc);\n" - << "\t\tconst real_t az = MwcNextNeg1Pos1(mwc);\n" + << "\t\tconst real_t ax = MwcNext0505(mwc);\n" + << "\t\tconst real_t ay = MwcNext0505(mwc);\n" + << "\t\tconst real_t az = MwcNext0505(mwc);\n" << "\t\tconst real_t r = sqrt(Sqr(vIn.x - " << x0 << ") + Sqr(vIn.y - " << y0 << ") + Sqr(vIn.z - " << z0 << "));\n" - << "\t\tconst real_t rc = ((" << invert << " != 0 ? min(1 - r, 0.0) : min(r, 0.0)) - " << minDist << ") * " << internalScatter << ";\n" - << "\t\tconst real_t rs = min(rc, 0.0);\n" + << "\t\tconst real_t rc = ((" << invert << " != 0 ? max(1 - r, 0.0) : max(r, 0.0)) - " << minDist << ") * " << internalScatter << ";\n" + << "\t\tconst real_t rs = max(rc, 0.0);\n" << "\n" << "\t\treal_t sigma, phi, rad, sigmas, sigmac, phis, phic;\n" << "\t\treal_t scale, denom;\n" @@ -2278,10 +2278,10 @@ public: void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) { - const v4T random(rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); + const v4T random(rand.Frand(T(-0.5), T(0.5)), rand.Frand(T(-0.5), T(0.5)), rand.Frand(T(-0.5), T(0.5)), rand.Frand(T(-0.5), T(0.5))); const T distA = sqrt(Sqr(helper.In.x - m_X0) + Sqr(helper.In.y - m_Y0) + Sqr(helper.In.z - m_Z0)); - const T distB = m_Invert != 0 ? min(1 - distA, 0) : min(distA, 0); - const T dist = min((distB - m_MinDist) * m_RMax, 0); + const T distB = m_Invert != 0 ? max(1 - distA, 0) : max(distA, 0);//Original called a macro named min, which internally performed max. + const T dist = max((distB - m_MinDist) * m_RMax, 0); switch ((int)m_Type) { @@ -2356,13 +2356,13 @@ public: string rMax = "parVars[" + ToUpper(m_Params[i++].Name()) + index; ss << "\t{\n" - << "\t\tconst real_t randx = MwcNextNeg1Pos1(mwc);\n" - << "\t\tconst real_t randy = MwcNextNeg1Pos1(mwc);\n" - << "\t\tconst real_t randz = MwcNextNeg1Pos1(mwc);\n" - << "\t\tconst real_t randc = MwcNextNeg1Pos1(mwc);\n" + << "\t\tconst real_t randx = MwcNext0505(mwc);\n" + << "\t\tconst real_t randy = MwcNext0505(mwc);\n" + << "\t\tconst real_t randz = MwcNext0505(mwc);\n" + << "\t\tconst real_t randc = MwcNext0505(mwc);\n" << "\t\tconst real_t distA = sqrt(Sqr(vIn.x - " << x0 << ") + Sqr(vIn.y - " << y0 << ") + Sqr(vIn.z - " << z0 << "));\n" - << "\t\tconst real_t distB = " << invert << " != 0 ? min(1 - distA, 0.0) : min(distA, 0.0);\n" - << "\t\tconst real_t dist = min((distB - " << minDist << ") * " << rMax<< ", 0.0);\n" + << "\t\tconst real_t distB = " << invert << " != 0 ? max(1 - distA, 0.0) : max(distA, 0.0);\n" + << "\t\tconst real_t dist = max((distB - " << minDist << ") * " << rMax<< ", 0.0);\n" << "\n" << "\t\tswitch ((int)" << type << ")\n" << "\t\t{\n" @@ -2474,7 +2474,7 @@ public: void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) { - const v4T random(rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); + const v4T random(rand.Frand(T(-0.5), T(0.5)), rand.Frand(T(-0.5), T(0.5)), rand.Frand(T(-0.5), T(0.5)), rand.Frand(T(-0.5), T(0.5))); T radius; switch ((int)m_BlurShape) @@ -2483,11 +2483,11 @@ public: radius = sqrt(Sqr(helper.In.x - m_CenterX) + Sqr(helper.In.y - m_CenterY) + Sqr(helper.In.z - m_CenterZ)); break; case 1://Square. - radius = min(fabs(helper.In.x - m_CenterX), min(fabs(helper.In.y - m_CenterY), (fabs(helper.In.z - m_CenterZ)))); + radius = max(fabs(helper.In.x - m_CenterX), max(fabs(helper.In.y - m_CenterY), (fabs(helper.In.z - m_CenterZ))));//Original called a macro named min, which internally performed max. break; } - const T dist = min(((m_InvertDistance != 0 ? min(1 - radius, 0) : min(radius, 0)) - m_MinDistance) * m_RMax, 0); + const T dist = max(((m_InvertDistance != 0 ? max(1 - radius, 0) : max(radius, 0)) - m_MinDistance) * m_RMax, 0); switch ((int)m_BlurType) { @@ -2566,10 +2566,10 @@ public: string rMax = "parVars[" + ToUpper(m_Params[i++].Name()) + index; ss << "\t{\n" - << "\t\tconst real_t randx = MwcNextNeg1Pos1(mwc);\n" - << "\t\tconst real_t randy = MwcNextNeg1Pos1(mwc);\n" - << "\t\tconst real_t randz = MwcNextNeg1Pos1(mwc);\n" - << "\t\tconst real_t randc = MwcNextNeg1Pos1(mwc);\n" + << "\t\tconst real_t randx = MwcNext0505(mwc);\n" + << "\t\tconst real_t randy = MwcNext0505(mwc);\n" + << "\t\tconst real_t randz = MwcNext0505(mwc);\n" + << "\t\tconst real_t randc = MwcNext0505(mwc);\n" << "\t\treal_t radius;\n" << "\n" << "\t\tswitch ((int)" << blurShape << ")\n" @@ -2578,11 +2578,11 @@ public: << "\t\t radius = sqrt(Sqr(vIn.x - " << centerX << ") + Sqr(vIn.y - " << centerY << ") + Sqr(vIn.z - " << centerZ << "));\n" << "\t\t break;\n" << "\t\t case 1:\n" - << "\t\t radius = min(fabs(vIn.x - " << centerX << "), min(fabs(vIn.y - " << centerY << "), (fabs(vIn.z - " << centerZ << "))));\n" + << "\t\t radius = max(fabs(vIn.x - " << centerX << "), max(fabs(vIn.y - " << centerY << "), (fabs(vIn.z - " << centerZ << "))));\n" << "\t\t break;\n" << "\t\t}\n" << "\n" - << "\t\tconst real_t dist = min(((" << invertDist << " != 0 ? min(1 - radius, 0.0) : min(radius, 0.0)) - " << minDist << ") * " << rMax << ", 0.0);\n" + << "\t\tconst real_t dist = max(((" << invertDist << " != 0 ? max(1 - radius, 0.0) : max(radius, 0.0)) - " << minDist << ") * " << rMax << ", 0.0);\n" << "\n" << "\t\tswitch ((int)" << blurType << ")\n" << "\t\t{\n" diff --git a/Source/EmberAnimate/EmberAnimate.rc b/Source/EmberAnimate/EmberAnimate.rc index b7bbd84..59941e7 100644 --- a/Source/EmberAnimate/EmberAnimate.rc +++ b/Source/EmberAnimate/EmberAnimate.rc @@ -49,8 +49,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,4,0,7 - PRODUCTVERSION 0,4,0,7 + FILEVERSION 0,4,0,8 + PRODUCTVERSION 0,4,0,8 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -67,12 +67,12 @@ BEGIN BEGIN VALUE "CompanyName", "Open Source" VALUE "FileDescription", "Renders fractal flames as animations with motion blur" - VALUE "FileVersion", "0.4.0.7" + VALUE "FileVersion", "0.4.0.8" VALUE "InternalName", "EmberAnimate.rc" VALUE "LegalCopyright", "Copyright (C) Matt Feemster 2013, GPL v3" VALUE "OriginalFilename", "EmberAnimate.rc" VALUE "ProductName", "Ember Animate" - VALUE "ProductVersion", "0.4.0.7" + VALUE "ProductVersion", "0.4.0.8" END END BLOCK "VarFileInfo" diff --git a/Source/EmberCL/EmberCLFunctions.h b/Source/EmberCL/EmberCLFunctions.h index bdd1782..f98ed31 100644 --- a/Source/EmberCL/EmberCLFunctions.h +++ b/Source/EmberCL/EmberCLFunctions.h @@ -171,6 +171,12 @@ static const char* RandFunctionString = " real_t f = (real_t)MwcNext(s) / (real_t)UINT_MAX;\n" " return -1.0 + (f * 2.0);\n" "}\n" + "\n" + "inline real_t MwcNext0505(uint2* s)\n" + "{\n" + " real_t f = (real_t)MwcNext(s) / (real_t)UINT_MAX;\n" + " return -0.5 + f;\n" + "}\n" "\n"; /// diff --git a/Source/EmberGenome/EmberGenome.rc b/Source/EmberGenome/EmberGenome.rc index 9938fe1..df718e5 100644 --- a/Source/EmberGenome/EmberGenome.rc +++ b/Source/EmberGenome/EmberGenome.rc @@ -49,8 +49,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,4,0,7 - PRODUCTVERSION 0,4,0,7 + FILEVERSION 0,4,0,8 + PRODUCTVERSION 0,4,0,8 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -67,12 +67,12 @@ BEGIN BEGIN VALUE "CompanyName", "Open Source" VALUE "FileDescription", "Manipulates fractal flames parameter files" - VALUE "FileVersion", "0.4.0.7" + VALUE "FileVersion", "0.4.0.8" VALUE "InternalName", "EmberGenome.rc" VALUE "LegalCopyright", "Copyright (C) Matt Feemster 2013, GPL v3" VALUE "OriginalFilename", "EmberGenome.rc" VALUE "ProductName", "Ember Genome" - VALUE "ProductVersion", "0.4.0.7" + VALUE "ProductVersion", "0.4.0.8" END END BLOCK "VarFileInfo" diff --git a/Source/EmberRender/EmberRender.rc b/Source/EmberRender/EmberRender.rc index a15adc8..c7936b7 100644 --- a/Source/EmberRender/EmberRender.rc +++ b/Source/EmberRender/EmberRender.rc @@ -49,8 +49,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,4,0,7 - PRODUCTVERSION 0,4,0,7 + FILEVERSION 0,4,0,8 + PRODUCTVERSION 0,4,0,8 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -67,12 +67,12 @@ BEGIN BEGIN VALUE "CompanyName", "Open Source" VALUE "FileDescription", "Renders fractal flames as single images" - VALUE "FileVersion", "0.4.0.7" + VALUE "FileVersion", "0.4.0.8" VALUE "InternalName", "EmberRender.rc" VALUE "LegalCopyright", "Copyright (C) Matt Feemster 2013, GPL v3" VALUE "OriginalFilename", "EmberRender.rc" VALUE "ProductName", "Ember Render" - VALUE "ProductVersion", "0.4.0.7" + VALUE "ProductVersion", "0.4.0.8" END END BLOCK "VarFileInfo" diff --git a/Source/EmberTester/EmberTester.cpp b/Source/EmberTester/EmberTester.cpp index f454006..0fc0e1d 100644 --- a/Source/EmberTester/EmberTester.cpp +++ b/Source/EmberTester/EmberTester.cpp @@ -1719,13 +1719,28 @@ void TestCross(T x, T y, T weight) cout << "Second way, outX, outY == " << outX << ", " << outY << endl; } +double RandD(QTIsaac& rand) +{ + return ((((rand.Rand()^(rand.Rand()<<15))&0xfffffff)*3.72529e-09)-0.5); +} + int _tmain(int argc, _TCHAR* argv[]) { + int i; Timing t(4); QTIsaac rand; //cout << pow(-1, 5.1) << endl; + /*for (i = 0; i < 2500000000; i++) + { + double d = fabs(RandD(rand)); + + if (d >= 0.5) + cout << d << endl; + } + + return 0;*/ //cout << "sizeof(Ember): " << sizeof(Ember) << endl; //cout << "sizeof(Ember): " << sizeof(Ember) << endl; // diff --git a/Source/Fractorium/AboutDialog.ui b/Source/Fractorium/AboutDialog.ui index 95933a5..f18e669 100644 --- a/Source/Fractorium/AboutDialog.ui +++ b/Source/Fractorium/AboutDialog.ui @@ -52,7 +52,7 @@ - <html><head/><body><p align="center"><br/><span style=" font-size:12pt;">Fractorium 0.4.0.7 Beta</span></p><p align="center"><span style=" font-size:10pt;"><br/>A Qt-based fractal flame editor which uses a C++ re-write of the flam3 algorithm named Ember and a GPU capable version named EmberCL which implements a portion of the cuburn algorithm in OpenCL.</span></p><p align="center"><span style=" font-size:10pt;">Matt Feemster</span></p></body></html> + <html><head/><body><p align="center"><br/><span style=" font-size:12pt;">Fractorium 0.4.0.8 Beta</span></p><p align="center"><span style=" font-size:10pt;"><br/>A Qt-based fractal flame editor which uses a C++ re-write of the flam3 algorithm named Ember and a GPU capable version named EmberCL which implements a portion of the cuburn algorithm in OpenCL.</span></p><p align="center"><span style=" font-size:10pt;">Matt Feemster</span></p></body></html> Qt::RichText diff --git a/Source/Fractorium/Fractorium.rc b/Source/Fractorium/Fractorium.rc index cbc6af5af91c5acb1ad969c22a77ed2adea73444..2e8866ce6a99c78e966b7f8e178bda0e7602c859 100644 GIT binary patch delta 46 wcmcbod{23U7YC!oWN!{bMvKk09PG?Mjv|-%WC32W&6~KHm>}HEXLyBJ05Dn$$N&HU delta 46 wcmcbod{23U7YC#HWN!{bM)S?J9PG?Mjv|-%WC32W&6~KHm>}HEXLyBJ059(table, this, row, 1, m_BrightnessSpin, spinHeight, 0.05, 100, 1, SIGNAL(valueChanged(double)), SLOT(OnBrightnessChanged(double)), true, 4.0, 4.0, 4.0); SetupSpinner(table, this, row, 1, m_GammaSpin, spinHeight, 1, 9999, 0.5, SIGNAL(valueChanged(double)), SLOT(OnGammaChanged(double)), true, 4.0, 4.0, 4.0); - SetupSpinner(table, this, row, 1, m_GammaThresholdSpin, spinHeight, 0, 10, 0.01, SIGNAL(valueChanged(double)), SLOT(OnGammaThresholdChanged(double)), true, 0.1, 0.1, 0.0); + SetupSpinner(table, this, row, 1, m_GammaThresholdSpin, spinHeight, 0, 10, 0.01, SIGNAL(valueChanged(double)), SLOT(OnGammaThresholdChanged(double)), true, 0.1, 0.1, 0.0); SetupSpinner(table, this, row, 1, m_VibrancySpin, spinHeight, 0, 30, 0.01, SIGNAL(valueChanged(double)), SLOT(OnVibrancyChanged(double)), true, 1.0, 1.0, 0.0); SetupSpinner(table, this, row, 1, m_HighlightSpin, spinHeight, -1.0, 2.0, 0.1, SIGNAL(valueChanged(double)), SLOT(OnHighlightPowerChanged(double)), true, -1.0, -1.0, -1.0); @@ -47,10 +47,10 @@ void Fractorium::InitParamsUI() table = ui.GeometryTable; SetupSpinner (table, this, row, 1, m_WidthSpin, spinHeight, 10, 100000, 50, SIGNAL(valueChanged(int)), SLOT(OnWidthChanged(int))); SetupSpinner (table, this, row, 1, m_HeightSpin, spinHeight, 10, 100000, 50, SIGNAL(valueChanged(int)), SLOT(OnHeightChanged(int))); - SetupSpinner(table, this, row, 1, m_CenterXSpin, spinHeight, -10, 10, 0.05, SIGNAL(valueChanged(double)), SLOT(OnCenterXChanged(double)), true, 0, 0, 0); - SetupSpinner(table, this, row, 1, m_CenterYSpin, spinHeight, -10, 10, 0.05, SIGNAL(valueChanged(double)), SLOT(OnCenterYChanged(double)), true, 0, 0, 0); - SetupSpinner(table, this, row, 1, m_ScaleSpin, spinHeight, 10, 5000, 20, SIGNAL(valueChanged(double)), SLOT(OnScaleChanged(double)), true, 240, 240, 240); - SetupSpinner(table, this, row, 1, m_ZoomSpin, spinHeight, 0, 5, 0.2, SIGNAL(valueChanged(double)), SLOT(OnZoomChanged(double)), true, 0, 0, 0); + SetupSpinner(table, this, row, 1, m_CenterXSpin, spinHeight, -dmax, dmax, 0.05, SIGNAL(valueChanged(double)), SLOT(OnCenterXChanged(double)), true, 0, 0, 0); + SetupSpinner(table, this, row, 1, m_CenterYSpin, spinHeight, -dmax, dmax, 0.05, SIGNAL(valueChanged(double)), SLOT(OnCenterYChanged(double)), true, 0, 0, 0); + SetupSpinner(table, this, row, 1, m_ScaleSpin, spinHeight, 10, dmax, 20, SIGNAL(valueChanged(double)), SLOT(OnScaleChanged(double)), true, 240, 240, 240); + SetupSpinner(table, this, row, 1, m_ZoomSpin, spinHeight, 0, 100, 0.2, SIGNAL(valueChanged(double)), SLOT(OnZoomChanged(double)), true, 0, 0, 0); SetupSpinner(table, this, row, 1, m_RotateSpin, spinHeight, -180, 180, 10, SIGNAL(valueChanged(double)), SLOT(OnRotateChanged(double)), true, 0, 0, 0); SetupSpinner(table, this, row, 1, m_ZPosSpin, spinHeight, -1000, 1000, 1, SIGNAL(valueChanged(double)), SLOT(OnZPosChanged(double)), true, 0, 1, 0); SetupSpinner(table, this, row, 1, m_PerspectiveSpin, spinHeight, -500, 500, 0.01, SIGNAL(valueChanged(double)), SLOT(OnPerspectiveChanged(double)), true, 0, 1, 0);