--User changes

-Update various tooltips.
 -Increase precision of affine and xaos spinners.
 -Increase precision of fields written in Xml files to 8.

--Bug fixes
 -When rendering on the CPU, if the number of threads didn't divide evenly into the number of rows, it would leave a blank spot on the last few rows.
 -Fix numerous parsing bugs when reading .chaos files.
 -Added compatibility fixes and/or optimizations to the following variations: asteria, bcircle, bcollide, bipolar, blob2, btransform, cell, circlecrop, circlecrop2, collideoscope, cpow2, cropn, cross, curl, depth_ngon2, depth_sine2, edisc, eRotate, escher, fan2, hex_rand, hypershift, hypershift2, hypertile1, julia, julian, julian2, juliaq, juliascope, lazyjess, log, loonie2, murl, murl2, npolar, oscilloscope2, perspective, phoenix_julia, sphericaln, squish, starblur, starblur2, truchet, truchet_glyph, waffle, wavesn.
This commit is contained in:
Person
2023-11-29 15:47:31 -07:00
parent b3ad38020e
commit c3078f018a
23 changed files with 1873 additions and 1076 deletions

View File

@ -692,8 +692,9 @@ public:
virtual void Precalc() override
{
m_V = m_Weight * m_BlurPixelizeSize;
m_InvSize = 1 / m_BlurPixelizeSize;
auto zsize = Zeps(m_BlurPixelizeSize);
m_V = m_Weight * zsize;
m_InvSize = 1 / zsize;
}
protected:
@ -841,7 +842,7 @@ protected:
m_Params.push_back(ParamWithName<T>(&m_Y0, prefix + "crop_top", -1));
m_Params.push_back(ParamWithName<T>(&m_X1, prefix + "crop_right", 1));
m_Params.push_back(ParamWithName<T>(&m_Y1, prefix + "crop_bottom", 1));
m_Params.push_back(ParamWithName<T>(&m_S, prefix + "crop_scatter_area", 0, eParamType::REAL, -1, 1));
m_Params.push_back(ParamWithName<T>(&m_S, prefix + "crop_scatter_area", 0, eParamType::REAL));
m_Params.push_back(ParamWithName<T>(&m_Z, prefix + "crop_zero", 0, eParamType::INTEGER, 0, 1));
m_Params.push_back(ParamWithName<T>(true, &m_X0_, prefix + "crop_x0_"));//Precalc.
m_Params.push_back(ParamWithName<T>(true, &m_Y0_, prefix + "crop_y0_"));
@ -882,9 +883,6 @@ public:
virtual void Func(IteratorHelper<T>& helper, Point<T>& outPoint, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand) override
{
if ((helper.In.x == 0) && (helper.In.y == 0))
return;
T x = helper.In.x * m_Scale;
T y = helper.In.y * m_Scale;
T r = std::sqrt(SQR(x) + SQR(y));
@ -899,11 +897,10 @@ public:
if (m_Bcbw != 0)
{
T ang = std::atan2(y, x);
T omega = (T(0.2) * m_Bcbw * rand.Frand01<T>()) + 1;
T px = omega * std::cos(ang);
T py = omega * std::sin(ang);
helper.Out.x = m_Weight * px;
helper.Out.y = m_Weight * py;
T omega = (m_BcbwFifth * rand.Frand01<T>()) + 1;
T temp = m_Weight * omega;
helper.Out.x = temp * std::cos(ang);
helper.Out.y = temp * std::sin(ang);
}
else
{
@ -925,30 +922,28 @@ public:
string scale = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string borderWidth = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string bcbw = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string bcbwfifth = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n"
<< "\t\tif ((vIn.x == 0) && (vIn.y == 0))\n"
<< "\t\t return;\n"
<< "\n"
<< "\t\treal_t x = vIn.x * " << scale << ";\n"
<< "\t\treal_t y = vIn.y * " << scale << ";\n"
<< "\t\treal_t weight = " << weight << ";\n"
<< "\t\treal_t scale = " << scale << ";\n"
<< "\t\treal_t x = vIn.x * scale;\n"
<< "\t\treal_t y = vIn.y * scale;\n"
<< "\t\treal_t r = sqrt(fma(x, x, SQR(y)));\n"
<< "\n"
<< "\t\tif (r <= 1)\n"
<< "\t\t{\n"
<< "\t\t vOut.x = " << weight << " * x;\n"
<< "\t\t vOut.y = " << weight << " * y;\n"
<< "\t\t vOut.x = weight * x;\n"
<< "\t\t vOut.y = weight * y;\n"
<< "\t\t}\n"
<< "\t\telse\n"
<< "\t\t{\n"
<< "\t\t if (" << bcbw << " != 0)\n"
<< "\t\t {\n"
<< "\t\t real_t ang = atan2(y, x);\n"
<< "\t\t real_t omega = fma((real_t)(0.2) * " << bcbw << ", MwcNext01(mwc), (real_t)(1.0));\n"
<< "\t\t real_t px = omega * cos(ang);\n"
<< "\t\t real_t py = omega * sin(ang);\n"
<< "\n"
<< "\t\t vOut.x = " << weight << " * px;\n"
<< "\t\t vOut.y = " << weight << " * py;\n"
<< "\t\t real_t omega = fma(" << bcbwfifth << ", MwcNext01(mwc), (real_t)(1.0));\n"
<< "\t\t real_t temp = weight * omega;\n"
<< "\t\t vOut.x = temp * cos(ang);\n"
<< "\t\t vOut.y = temp * sin(ang);\n"
<< "\t\t }\n"
<< "\t\t else\n"
<< "\t\t {\n"
@ -965,6 +960,7 @@ public:
virtual void Precalc() override
{
m_Bcbw = std::abs(m_BorderWidth);
m_BcbwFifth = T(0.2) * m_Bcbw;
}
protected:
@ -975,12 +971,14 @@ protected:
m_Params.push_back(ParamWithName<T>(&m_Scale, prefix + "bcircle_scale", 1));
m_Params.push_back(ParamWithName<T>(&m_BorderWidth, prefix + "bcircle_borderwidth"));
m_Params.push_back(ParamWithName<T>(true, &m_Bcbw, prefix + "bcircle_bcbw"));//Precalc.
m_Params.push_back(ParamWithName<T>(true, &m_BcbwFifth, prefix + "bcircle_bcbw_fifth"));//Precalc.
}
private:
T m_Scale;
T m_BorderWidth;
T m_Bcbw;//Precalc.
T m_BcbwFifth;
};
/// <summary>
@ -2584,38 +2582,60 @@ public:
virtual void Func(IteratorHelper<T>& helper, Point<T>& outPoint, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand) override
{
T d, r = helper.m_PrecalcSqrtSumSquares;
if (r > 1)
if (Compat::m_Compat)
{
if (rand.Frand01<T>() > T(0.5))
T d, r = helper.m_PrecalcSqrtSumSquares;
if (r > 1)
{
d = std::sqrt(r + helper.In.x);
helper.Out.x = m_V2 * d;
helper.Out.y = -(m_V2 / d * helper.In.y);
if (rand.Frand01<T>() > T(0.5))
{
d = std::sqrt(r + helper.In.x);
helper.Out.x = m_V2 * d;
helper.Out.y = -(m_V2 / d * helper.In.y);
}
else
{
d = r + helper.In.x;
r = m_Weight / std::sqrt(r * (SQR(helper.In.y) + SQR(d)));
helper.Out.x = r * d;
helper.Out.y = r * helper.In.y;
}
}
else
{
d = r + helper.In.x;
r = m_Weight / std::sqrt(r * (SQR(helper.In.y) + SQR(d)));
helper.Out.x = r * d;
helper.Out.y = r * helper.In.y;
if (rand.Frand01<T>() > T(0.5))
{
d = Zeps(std::sqrt(r + helper.In.x));
helper.Out.x = -(m_V2 * d);
helper.Out.y = -(m_V2 / d * helper.In.y);
}
else
{
d = r + helper.In.x;
r = m_Weight / Zeps(std::sqrt(r * (SQR(helper.In.y) + SQR(d))));
helper.Out.x = -(r * d);
helper.Out.y = r * helper.In.y;
}
}
}
else
{
if (rand.Frand01<T>() > T(0.5))
T r2 = helper.m_PrecalcSumSquares;
T sr = helper.m_PrecalcSqrtSumSquares;
T aux = r2 > 1 ? T(1) : T(-1);
T temp = std::sqrt(sr + helper.In.x);
if (rand.Frand01<T>() < T(0.5))
{
d = Zeps(std::sqrt(r + helper.In.x));
helper.Out.x = -(m_V2 * d);
helper.Out.y = -(m_V2 / d * helper.In.y);
helper.Out.x = m_V2 * aux * temp;
helper.Out.y = m_V2 * (-helper.In.y / Zeps(temp));
}
else
{
d = r + helper.In.x;
r = m_Weight / Zeps(std::sqrt(r * (SQR(helper.In.y) + SQR(d))));
helper.Out.x = -(r * d);
helper.Out.y = r * helper.In.y;
T tempweight = m_V2 / Zeps(sr);
helper.Out.x = tempweight * aux * temp;
helper.Out.y = tempweight * (helper.In.y / Zeps(temp));
}
}
@ -2630,42 +2650,67 @@ public:
string index = ss2.str();
string weight = WeightDefineString();
string v2 = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Precalcs only, no params.
ss << "\t{\n"
<< "\t\treal_t d, r = precalcSqrtSumSquares;\n"
<< "\n"
<< "\t\tif (r > 1)\n"
<< "\t\t{\n"
<< "\t\t if (MwcNext01(mwc) > (real_t)(0.5))\n"
<< "\t\t {\n"
<< "\t\t d = sqrt(r + vIn.x);\n"
<< "\t\t vOut.x = " << v2 << " * d;\n"
<< "\t\t vOut.y = -(" << v2 << " / d * vIn.y);\n"
<< "\t\t }\n"
<< "\t\t else\n"
<< "\t\t {\n"
<< "\t\t d = r + vIn.x;\n"
<< "\t\t r = " << weight << " / sqrt(r * fma(vIn.y, vIn.y, SQR(d)));\n"
<< "\t\t vOut.x = r * d;\n"
<< "\t\t vOut.y = r * vIn.y;\n"
<< "\t\t }\n"
<< "\t\t}\n"
<< "\t\telse\n"
<< "\t\t{\n"
<< "\t\t if (MwcNext01(mwc) > (real_t)(0.5))\n"
<< "\t\t {\n"
<< "\t\t d = Zeps(sqrt(r + vIn.x));\n"
<< "\t\t vOut.x = -(" << v2 << " * d);\n"
<< "\t\t vOut.y = -(" << v2 << " / d * vIn.y);\n"
<< "\t\t }\n"
<< "\t\t else\n"
<< "\t\t {\n"
<< "\t\t d = r + vIn.x;\n"
<< "\t\t r = " << weight << " / sqrt(r * fma(vIn.y, vIn.y, SQR(d)));\n"
<< "\t\t vOut.x = -(r * d);\n"
<< "\t\t vOut.y = r * vIn.y;\n"
<< "\t\t }\n"
<< "\t\t}\n"
<< "\n"
if (Compat::m_Compat)
{
ss << "\t{\n"
<< "\t\treal_t d, r = precalcSqrtSumSquares;\n"
<< "\n"
<< "\t\tif (r > 1)\n"
<< "\t\t{\n"
<< "\t\t if (MwcNext01(mwc) > (real_t)(0.5))\n"
<< "\t\t {\n"
<< "\t\t d = sqrt(r + vIn.x);\n"
<< "\t\t vOut.x = " << v2 << " * d;\n"
<< "\t\t vOut.y = -(" << v2 << " / d * vIn.y);\n"
<< "\t\t }\n"
<< "\t\t else\n"
<< "\t\t {\n"
<< "\t\t d = r + vIn.x;\n"
<< "\t\t r = " << weight << " / sqrt(r * fma(vIn.y, vIn.y, SQR(d)));\n"
<< "\t\t vOut.x = r * d;\n"
<< "\t\t vOut.y = r * vIn.y;\n"
<< "\t\t }\n"
<< "\t\t}\n"
<< "\t\telse\n"
<< "\t\t{\n"
<< "\t\t if (MwcNext01(mwc) > (real_t)(0.5))\n"
<< "\t\t {\n"
<< "\t\t d = Zeps(sqrt(r + vIn.x));\n"
<< "\t\t vOut.x = -(" << v2 << " * d);\n"
<< "\t\t vOut.y = -(" << v2 << " / d * vIn.y);\n"
<< "\t\t }\n"
<< "\t\t else\n"
<< "\t\t {\n"
<< "\t\t d = r + vIn.x;\n"
<< "\t\t r = " << weight << " / sqrt(r * fma(vIn.y, vIn.y, SQR(d)));\n"
<< "\t\t vOut.x = -(r * d);\n"
<< "\t\t vOut.y = r * vIn.y;\n"
<< "\t\t }\n"
<< "\t\t}\n";
}
else
{
ss << "\t{\n"
<< "\t\treal_t r2 = precalcSumSquares;\n"
<< "\t\treal_t sr = precalcSqrtSumSquares;\n"
<< "\t\treal_t aux = r2 > 1 ? (real_t)(1.0) : (real_t)(-1.0);\n"
<< "\t\treal_t temp = sqrt(sr + vIn.x);\n"
<< "\n"
<< "\t\tif (MwcNext01(mwc) < (real_t)(0.5))\n"
<< "\t\t{\n"
<< "\t\t vOut.x = " << v2 << " * aux * temp;\n"
<< "\t\t vOut.y = " << v2 << " * (-vIn.y / Zeps(temp));\n"
<< "\t\t}\n"
<< "\t\telse\n"
<< "\t\t{\n"
<< "\t\t real_t tempweight = " << v2 << " / Zeps(sr);\n"
<< "\t\t vOut.x = tempweight * aux * temp;\n"
<< "\t\t vOut.y = tempweight * (vIn.y / Zeps(temp));\n"
<< "\t\t}\n";
}
ss << "\n"
<< "\t\tvOut.z = " << DefaultZCl()
<< "\t}\n";
return ss.str();
@ -2673,7 +2718,7 @@ public:
virtual void Precalc() override
{
m_V2 = m_Weight * std::sqrt(T(2)) / 2;
m_V2 = m_Weight * (std::sqrt(T(2)) / 2);
}
virtual vector<string> OpenCLGlobalFuncNames() const override
@ -3109,9 +3154,9 @@ protected:
{
string prefix = Prefix();
m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_P, prefix + "hypertile_p", T(3)));
m_Params.push_back(ParamWithName<T>(&m_Q, prefix + "hypertile_q", T(7)));
m_Params.push_back(ParamWithName<T>(&m_N, prefix + "hypertile_n", T(0)));
m_Params.push_back(ParamWithName<T>(&m_P, prefix + "hypertile_p", 3));
m_Params.push_back(ParamWithName<T>(&m_Q, prefix + "hypertile_q", 7));
m_Params.push_back(ParamWithName<T>(&m_N, prefix + "hypertile_n", 0));
m_Params.push_back(ParamWithName<T>(true, &m_Real, prefix + "hypertile_real"));//Precalc.
m_Params.push_back(ParamWithName<T>(true, &m_Imag, prefix + "hypertile_imag"));
}
@ -3140,7 +3185,13 @@ public:
virtual void Func(IteratorHelper<T>& helper, Point<T>& outPoint, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand) override
{
T temp = rand.Crand() * m_Pa;
T temp;
if (Compat::m_Compat)
temp = rand.Crand() * m_Pa;
else
temp = Floor(rand.Frand01<T>() * m_IP) * m_Pa;
T sina = std::sin(temp);
T cosa = std::cos(temp);
T re = m_R * cosa;
@ -3149,7 +3200,7 @@ public:
T b = helper.In.y - im;
T c = re * helper.In.x - im * helper.In.y + 1;
T d = re * helper.In.y + im * helper.In.x;
T vr = m_Weight / (SQR(c) + SQR(d));
T vr = m_Weight / Zeps(SQR(c) + SQR(d));
helper.Out.x = vr * (a * c + b * d);
helper.Out.y = vr * (b * c - a * d);
helper.Out.z = DefaultZ(helper);
@ -3167,17 +3218,23 @@ public:
string pa = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string r = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string ip = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n"
<< "\t\treal_t temp = MwcNextCrand(mwc) * " << pa << ";\n"
<< "\t\treal_t sina = sin(temp);\n"
ss << "\t{\n";
if (Compat::m_Compat)
ss << "\t\treal_t temp = MwcNextCrand(mwc) * " << pa << ";\n";
else
ss << "\t\treal_t temp = floor(MwcNext01(mwc) * " << ip << ") * " << pa << ";\n";
ss << "\t\treal_t sina = sin(temp);\n"
<< "\t\treal_t cosa = cos(temp);\n"
<< "\t\treal_t re = " << r << " * cosa;\n"
<< "\t\treal_t im = " << r << " * sina;\n"
<< "\t\treal_t r = " << r << ";\n"
<< "\t\treal_t re = r * cosa;\n"
<< "\t\treal_t im = r * sina;\n"
<< "\t\treal_t a = vIn.x + re;\n"
<< "\t\treal_t b = vIn.y - im;\n"
<< "\t\treal_t c = fma(re, vIn.x, -(im * vIn.y)) + 1;\n"
<< "\t\treal_t d = fma(re, vIn.y, im * vIn.x);\n"
<< "\t\treal_t vr = " << weight << " / fma(c, c, SQR(d));\n"
<< "\t\treal_t vr = " << weight << " / Zeps(fma(c, c, SQR(d)));\n"
<< "\n"
<< "\t\tvOut.x = vr * fma(a, c, b * d);\n"
<< "\t\tvOut.y = vr * fma(b, c, -(a * d));\n"
@ -3195,13 +3252,18 @@ public:
m_IP = T((int)m_P);
}
virtual vector<string> OpenCLGlobalFuncNames() const override
{
return vector<string> { "Zeps" };
}
protected:
void Init()
{
string prefix = Prefix();
m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_P, prefix + "hypertile1_p", T(3)));
m_Params.push_back(ParamWithName<T>(&m_Q, prefix + "hypertile1_q", T(7)));
m_Params.push_back(ParamWithName<T>(&m_P, prefix + "hypertile1_p", 3));
m_Params.push_back(ParamWithName<T>(&m_Q, prefix + "hypertile1_q", 7));
m_Params.push_back(ParamWithName<T>(true, &m_Pa, prefix + "hypertile1_pa"));//Precalc.
m_Params.push_back(ParamWithName<T>(true, &m_R, prefix + "hypertile1_r"));
m_Params.push_back(ParamWithName<T>(true, &m_IP, prefix + "hypertile1_ip"));
@ -3237,7 +3299,7 @@ public:
T d = m_R * helper.In.y;
T x = (a * c + b * d);
T y = (b * c - a * d);
T vr = m_Weight / (SQR(c) + SQR(d));
T vr = m_Weight / Zeps(SQR(c) + SQR(d));
T temp = rand.Crand() * m_Pa;
T sina = std::sin(temp);
T cosa = std::cos(temp);
@ -3258,13 +3320,14 @@ public:
string pa = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string r = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n"
<< "\t\treal_t a = vIn.x + " << r << ";\n"
<< "\t\treal_t r = " << r << ";\n"
<< "\t\treal_t a = vIn.x + r;\n"
<< "\t\treal_t b = vIn.y;\n"
<< "\t\treal_t c = fma(" << r << ", vIn.x, (real_t)(1.0));\n"
<< "\t\treal_t d = " << r << " * vIn.y;\n"
<< "\t\treal_t c = fma(r, vIn.x, (real_t)(1.0));\n"
<< "\t\treal_t d = r * vIn.y;\n"
<< "\t\treal_t x = fma(a, c, b * d);\n"
<< "\t\treal_t y = fma(b, c, -(a * d));\n"
<< "\t\treal_t vr = " << weight << " / fma(c, c, SQR(d));\n"
<< "\t\treal_t vr = " << weight << " / Zeps(fma(c, c, SQR(d)));\n"
<< "\t\treal_t temp = MwcNextCrand(mwc) * " << pa << ";\n"
<< "\t\treal_t sina = sin(temp);\n"
<< "\t\treal_t cosa = cos(temp);\n"
@ -3284,13 +3347,18 @@ public:
m_R = (r2 > 0) ? T(1) / sqrt(r2) : T(1);
}
virtual vector<string> OpenCLGlobalFuncNames() const override
{
return vector<string> { "Zeps" };
}
protected:
void Init()
{
string prefix = Prefix();
m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_P, prefix + "hypertile2_p", T(3)));
m_Params.push_back(ParamWithName<T>(&m_Q, prefix + "hypertile2_q", T(7)));
m_Params.push_back(ParamWithName<T>(&m_P, prefix + "hypertile2_p", 3));
m_Params.push_back(ParamWithName<T>(&m_Q, prefix + "hypertile2_q", 7));
m_Params.push_back(ParamWithName<T>(true, &m_Pa, prefix + "hypertile2_pa"));//Precalc.
m_Params.push_back(ParamWithName<T>(true, &m_R, prefix + "hypertile2_r"));
}
@ -3717,14 +3785,23 @@ public:
virtual void Func(IteratorHelper<T>& helper, Point<T>& outPoint, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand) override
{
T a;
T x = m_A * helper.In.x + m_B * helper.In.y + m_E;
T y = m_C * helper.In.x + m_D * helper.In.y + m_F;
T angle = (std::atan2(y, x) + M_2PI * rand.Rand(size_t(m_AbsN))) / m_Power;
T sina = std::sin(angle);
T cosa = std::cos(angle);
T r = m_Weight * std::pow(SQR(x) + SQR(y), m_Cn);
helper.Out.x = r * cosa;
helper.Out.y = r * sina;
if (Compat::m_Compat)//You need to implement this on the gpu and make sure this is even what the original does. Also search all julias that use "root".
{
a = (std::atan2(y, x) + M_2PI * rand.Rand(size_t(m_AbsN))) / m_Power;
}
else
{
auto root = (int)(m_AbsN * rand.Frand01<T>());
a = (std::atan2(y, x) + root * M_2PI) / m_Power;
}
helper.Out.x = r * std::cos(a);
helper.Out.y = r * std::sin(a);
helper.Out.z = DefaultZ(helper);
}
@ -3746,15 +3823,19 @@ public:
string absn = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string cn = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n"
<< "\t\treal_t a;\n"
<< "\t\treal_t x = fma(" << a << ", vIn.x, fma(" << b << ", vIn.y, " << e << "));\n"
<< "\t\treal_t y = fma(" << c << ", vIn.x, fma(" << d << ", vIn.y, " << f << "));\n"
<< "\t\treal_t angle = fma(M_2PI, (real_t)MwcNextRange(mwc, (uint)" << absn << "), atan2(y, x)) / " << power << ";\n"
<< "\t\treal_t sina = sin(angle);\n"
<< "\t\treal_t cosa = cos(angle);\n"
<< "\t\treal_t r = " << weight << " * pow(fma(x, x, SQR(y)), " << cn << ");\n"
<< "\n"
<< "\t\tvOut.x = r * cosa;\n"
<< "\t\tvOut.y = r * sina;\n"
<< "\t\treal_t r = " << weight << " * pow(fma(x, x, SQR(y)), " << cn << ");\n";
if (Compat::m_Compat)
ss << "\t\ta = fma(M_2PI, (real_t)MwcNextRange(mwc, (uint)" << absn << "), atan2(y, x)) / " << power << ";\n";
else
ss << "\t\tint root = (int)(" << absn << " * MwcNext01(mwc));\n"
<< "\t\ta = (atan2(y, x) + root + M_2PI) / " << power << ";\n";
ss << "\t\tvOut.x = r * cos(a);\n"
<< "\t\tvOut.y = r * sin(a);\n"
<< "\t\tvOut.z = " << DefaultZCl()
<< "\t}\n";
return ss.str();
@ -3765,7 +3846,11 @@ public:
if (m_Power == 0)
m_Power = 2;
m_AbsN = T(int(abs(m_Power)));
if (Compat::m_Compat)
m_AbsN = T(int(abs(m_Power)));
else
m_AbsN = std::abs(m_Power);
m_Cn = m_Dist / m_Power / 2;
}
@ -3780,7 +3865,7 @@ protected:
m_Params.push_back(ParamWithName<T>(&m_D, prefix + "julian2_d", 1));
m_Params.push_back(ParamWithName<T>(&m_E, prefix + "julian2_e"));
m_Params.push_back(ParamWithName<T>(&m_F, prefix + "julian2_f"));
m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "julian2_power", 2, eParamType::INTEGER_NONZERO));
m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "julian2_power", 2, eParamType::REAL_NONZERO));
m_Params.push_back(ParamWithName<T>(&m_Dist, prefix + "julian2_dist", 1));
m_Params.push_back(ParamWithName<T>(true, &m_AbsN, prefix + "julian2_absn"));//Precalc.
m_Params.push_back(ParamWithName<T>(true, &m_Cn, prefix + "julian2_cn"));
@ -3851,9 +3936,10 @@ public:
virtual void Precalc() override
{
m_HalfInvPower = T(0.5) * m_Divisor / m_Power;
m_InvPower = m_Divisor / m_Power;
m_InvPower2pi = M_2PI / m_Power;
auto p = Zeps(m_Power);
m_HalfInvPower = T(0.5) * (m_Divisor / p);
m_InvPower = m_Divisor / p;
m_InvPower2pi = M_2PI / p;
}
protected:
@ -3861,8 +3947,8 @@ protected:
{
string prefix = Prefix();
m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "juliaq_power", 3, eParamType::INTEGER_NONZERO));
m_Params.push_back(ParamWithName<T>(&m_Divisor, prefix + "juliaq_divisor", 2, eParamType::INTEGER_NONZERO));
m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "juliaq_power", 3, eParamType::REAL_NONZERO));
m_Params.push_back(ParamWithName<T>(&m_Divisor, prefix + "juliaq_divisor", 2, eParamType::REAL_NONZERO));
m_Params.push_back(ParamWithName<T>(true, &m_HalfInvPower, prefix + "juliaq_half_inv_power"));//Precalc.
m_Params.push_back(ParamWithName<T>(true, &m_InvPower, prefix + "juliaq_inv_power"));
m_Params.push_back(ParamWithName<T>(true, &m_InvPower2pi, prefix + "juliaq_inv_power_2pi"));
@ -3949,7 +4035,7 @@ protected:
string prefix = Prefix();
m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_C, prefix + "murl_c"));
m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "murl_power", 2, eParamType::INTEGER, 2, T(0x7fffffff)));
m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "murl_power", 2, eParamType::REAL, 2));
m_Params.push_back(ParamWithName<T>(true, &m_Cp, prefix + "murl_cp"));//Precalc.
m_Params.push_back(ParamWithName<T>(true, &m_P2, prefix + "murl_p2"));
m_Params.push_back(ParamWithName<T>(true, &m_Vp, prefix + "murl_vp"));
@ -4052,7 +4138,7 @@ protected:
string prefix = Prefix();
m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_C, prefix + "murl2_c", 0, eParamType::REAL, -1, 1));
m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "murl2_power", 1, eParamType::INTEGER_NONZERO));
m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "murl2_power", 1));
m_Params.push_back(ParamWithName<T>(true, &m_P2, prefix + "murl2_p2"));//Precalc.
m_Params.push_back(ParamWithName<T>(true, &m_InvP, prefix + "murl2_invp"));
m_Params.push_back(ParamWithName<T>(true, &m_InvP2, prefix + "murl2_invp2"));
@ -4075,7 +4161,7 @@ template <typename T>
class NPolarVariation : public ParametricVariation<T>
{
public:
NPolarVariation(T weight = 1.0) : ParametricVariation<T>("npolar", eVariationId::VAR_NPOLAR, weight, true, false, false, true, false)
NPolarVariation(T weight = 1.0) : ParametricVariation<T>("npolar", eVariationId::VAR_NPOLAR, weight, true, false, false, true, true)
{
Init();
}
@ -4086,23 +4172,47 @@ public:
{
T x, y;
if (m_IsOdd != 0)
if (Compat::m_Compat)
{
T angle = (std::atan2(helper.In.y, helper.In.x) + M_2PI * rand.Rand(size_t(m_AbsN))) * m_Nnz;
T r = m_Weight * std::pow(SQR(helper.In.x) + SQR(helper.In.y), m_Cn) * m_Parity;
x = std::cos(angle) * r;
y = std::sin(angle) * r;
if (m_IsOdd != 0)
{
T angle = (helper.m_PrecalcAtanyx + M_2PI * rand.Rand(size_t(m_AbsN))) / m_Nnz;
T r = m_Weight * std::pow(helper.m_PrecalcSumSquares, m_Cn) * m_Parity;
x = std::cos(angle) * r;
y = std::sin(angle) * r;
}
else
{
x = m_Vvar * helper.m_PrecalcAtanxy;
y = m_Vvar2 * std::log(helper.m_PrecalcSumSquares);
T angle = (std::atan2(y, x) + M_2PI * rand.Rand(size_t(m_AbsN))) / m_Nnz;
T r = m_Weight * std::pow(SQR(x) + SQR(y), m_Cn);
T sina = std::sin(angle) * r;
T cosa = std::cos(angle) * r;
x = m_Vvar2 * std::log(SQR(cosa) + SQR(sina));
y = m_Vvar * std::atan2(cosa, sina);
}
}
else
{
x = m_Vvar * helper.m_PrecalcAtanxy;
y = m_Vvar2 * std::log(helper.m_PrecalcSumSquares);
T angle = (std::atan2(y, x) + M_2PI * rand.Rand(size_t(m_AbsN))) * m_Nnz;
T r = m_Weight * std::pow(SQR(x) + SQR(y), m_Cn);
T sina = std::sin(angle) * r;
T cosa = std::cos(angle) * r;
x = m_Vvar2 * std::log(SQR(cosa) + SQR(sina));
y = m_Vvar * std::atan2(cosa, sina);
if (m_IsOdd != 0)
{
T angle = (helper.m_PrecalcAtanyx + M_2PI * rand.Rand(size_t(m_AbsN))) / m_Nnz;
T r = m_Weight * std::pow(helper.m_PrecalcSumSquares, m_Cn);
x = std::cos(angle) * r;
y = std::sin(angle) * r;
}
else
{
x = m_Vvar * helper.m_PrecalcAtanxy;
y = m_Vvar2 * std::log(helper.m_PrecalcSumSquares);
T angle = (std::atan2(y, x) + M_2PI * rand.Rand(size_t(m_AbsN))) / m_Nnz;
T r = m_Weight * std::pow(SQR(x) + SQR(y), m_Cn) * m_Parity;
T sina = std::sin(angle) * r;
T cosa = std::cos(angle) * r;
x = m_Vvar2 * 2 * std::log(r);
y = m_Vvar * std::atan2(cosa, sina);
}
}
helper.Out.x = x;
@ -4127,41 +4237,69 @@ public:
string isOdd = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n"
<< "\t\treal_t x, y;\n"
<< "\n"
<< "\t\tif (" << isOdd << " != 0)\n"
<< "\t\t{\n"
<< "\t\t real_t angle = (atan2(vIn.y, vIn.x) + M_2PI * MwcNextRange(mwc, (uint)" << absn << ")) * " << nnz << ";\n"
<< "\t\t real_t r = " << weight << " * pow(SQR(vIn.x) + SQR(vIn.y), " << cn << ") * " << parity << ";\n"
<< "\t\t x = cos(angle) * r;\n"
<< "\t\t y = sin(angle) * r;\n"
<< "\t\t}\n"
<< "\t\telse\n"
<< "\t\t{\n"
<< "\t\t x = " << vvar << " * precalcAtanxy;\n"
<< "\t\t y = " << vvar2 << " * log(precalcSumSquares);\n"
<< "\t\t real_t angle = (atan2(y, x) + M_2PI * MwcNextRange(mwc, (uint)" << absn << ")) * " << nnz << ";\n"
<< "\t\t real_t r = " << weight << " * pow(SQR(x) + SQR(y), " << cn << ");\n"
<< "\t\t real_t sina = sin(angle) * r;\n"
<< "\t\t real_t cosa = cos(angle) * r;\n"
<< "\t\t x = " << vvar2 << " * log(SQR(cosa) + SQR(sina));\n"
<< "\t\t y = " << vvar << " * atan2(cosa, sina);\n"
<< "\t\t}\n"
<< "\n"
<< "\t\tvOut.x = x;\n"
<< "\t\tvOut.y = y;\n"
<< "\t\tvOut.z = " << DefaultZCl()
<< "\t}\n";
<< "\t\treal_t vvar = " << vvar << ";\n"
<< "\t\treal_t vvar2 = " << vvar2 << ";\n"
<< "\n";
if (Compat::m_Compat)
{
ss << "\t\tif (" << isOdd << " != 0)\n"
<< "\t\t{\n"
<< "\t\t real_t angle = (precalcAtanyx + M_2PI * MwcNextRange(mwc, (uint)" << absn << ")) / " << nnz << ";\n"
<< "\t\t real_t r = " << weight << " * pow(precalcSumSquares, " << cn << ") * " << parity << ";\n"
<< "\t\t x = cos(angle) * r;\n"
<< "\t\t y = sin(angle) * r;\n"
<< "\t\t}\n"
<< "\t\telse\n"
<< "\t\t{\n"
<< "\t\t x = vvar * precalcAtanxy;\n"
<< "\t\t y = vvar2 * log(precalcSumSquares);\n"
<< "\t\t real_t angle = (atan2(y, x) + M_2PI * MwcNextRange(mwc, (uint)" << absn << ")) / " << nnz << ";\n"
<< "\t\t real_t r = " << weight << " * pow(SQR(x) + SQR(y), " << cn << ");\n"
<< "\t\t real_t sina = sin(angle) * r;\n"
<< "\t\t real_t cosa = cos(angle) * r;\n"
<< "\t\t x = vvar2 * log(SQR(cosa) + SQR(sina));\n"
<< "\t\t y = vvar * atan2(cosa, sina);\n"
<< "\t\t}\n";
}
else
{
ss << "\t\tif (" << isOdd << " != 0)\n"
<< "\t\t{\n"
<< "\t\t real_t angle = (precalcAtanyx + M_2PI * MwcNextRange(mwc, (uint)" << absn << ")) / " << nnz << ";\n"
<< "\t\t real_t r = " << weight << " * pow(precalcSumSquares, " << cn << ");\n"
<< "\t\t x = cos(angle) * r;\n"
<< "\t\t y = sin(angle) * r;\n"
<< "\t\t}\n"
<< "\t\telse\n"
<< "\t\t{\n"
<< "\t\t x = vvar * precalcAtanxy;\n"
<< "\t\t y = vvar2 * log(precalcSumSquares);\n"
<< "\t\t real_t angle = (atan2(y, x) + M_2PI * MwcNextRange(mwc, (uint)" << absn << ")) / " << nnz << ";\n"
<< "\t\t real_t r = " << weight << " * pow(SQR(x) + SQR(y), " << cn << ") * " << parity << ";\n"
<< "\t\t real_t sina = sin(angle) * r;\n"
<< "\t\t real_t cosa = cos(angle) * r;\n"
<< "\t\t x = vvar2 * (real_t)(2.0) * log(r);\n"
<< "\t\t y = vvar * atan2(cosa, sina);\n"
<< "\t\t}\n";
}
ss << "\n"
<< "\t\tvOut.x = x;\n"
<< "\t\tvOut.y = y;\n"
<< "\t\tvOut.z = " << DefaultZCl()
<< "\t}\n";
return ss.str();
}
virtual void Precalc() override
{
m_Nnz = 1 / ((m_N == 0) ? 1 : m_N);
m_Nnz = m_N == 0 ? 1 : m_N;
m_Vvar = m_Weight / T(M_PI);
m_Vvar2 = m_Vvar * T(0.5);
m_AbsN = abs(m_Nnz);
m_AbsN = std::abs(m_Nnz);
m_Cn = 1 / m_Nnz / 2;
m_IsOdd = T(abs(int(m_Parity)) & 1);
m_IsOdd = std::fmod(std::abs(m_Parity), T(2.0));
}
protected:
@ -4169,8 +4307,8 @@ protected:
{
string prefix = Prefix();
m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_Parity, prefix + "npolar_parity", 0, eParamType::INTEGER));
m_Params.push_back(ParamWithName<T>(&m_N, prefix + "npolar_n", 1, eParamType::INTEGER));
m_Params.push_back(ParamWithName<T>(&m_Parity, prefix + "npolar_parity", 0));
m_Params.push_back(ParamWithName<T>(&m_N, prefix + "npolar_n", 1));
m_Params.push_back(ParamWithName<T>(true, &m_Nnz, prefix + "npolar_nnz"));//Precalc.
m_Params.push_back(ParamWithName<T>(true, &m_Vvar, prefix + "npolar_vvar"));
m_Params.push_back(ParamWithName<T>(true, &m_Vvar2, prefix + "npolar_vvar_2"));
@ -5487,12 +5625,14 @@ public:
string weight = WeightDefineString();
string vvar2 = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Precalcs only, no params.
ss << "\t{\n"
<< "\t\treal_t vvar2 = " << vvar2 << ";\n"
<< "\t\treal_t r = exp(vIn.y);\n"
<< "\t\treal_t s = sin(vIn.x);\n"
<< "\t\treal_t c = cos(vIn.x);\n"
<< "\t\treal_t vvar2r = vvar2 * r;\n"
<< "\n"
<< "\t\tvOut.x = " << vvar2 << " * r * s;\n"
<< "\t\tvOut.y = " << vvar2 << " * r * c;\n"
<< "\t\tvOut.x = vvar2r * s;\n"
<< "\t\tvOut.y = vvar2r * c;\n"
<< "\t\tvOut.z = " << DefaultZCl()
<< "\t}\n";
return ss.str();
@ -5601,7 +5741,7 @@ protected:
m_Params.push_back(ParamWithName<T>(&m_ScaleY, prefix + "wavesn_scaley", 1));
m_Params.push_back(ParamWithName<T>(&m_IncX, prefix + "wavesn_incx"));
m_Params.push_back(ParamWithName<T>(&m_IncY, prefix + "wavesn_incy"));
m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "wavesn_power", 1, eParamType::INTEGER_NONZERO));
m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "wavesn_power", 1));
m_Params.push_back(ParamWithName<T>(true, &m_AbsN, prefix + "wavesn_absn"));//Precalc.
m_Params.push_back(ParamWithName<T>(true, &m_Cn, prefix + "wavesn_cn"));
}
@ -6034,14 +6174,15 @@ public:
virtual void Precalc() override
{
auto spread = Zeps(m_Spread);
m_Ang = M_2PI / m_Divisor;
m_C = m_R * std::cos(T(M_PI) / 2 * m_A) / m_Divisor;
m_D = m_R * std::sin(T(M_PI) / 2 * m_A) / m_Divisor;
m_HalfC = m_C / 2;
m_HalfD = m_D / 2;
m_InvSpread = T(0.5) / m_Spread;
m_FullSpread = M_2PI * m_Spread;
m_SpreadUint = uint(m_Spread);
m_InvSpread = T(0.5) / spread;
m_FullSpread = M_2PI * spread;
m_SpreadUint = uint(spread);
}
protected:
@ -6051,8 +6192,8 @@ protected:
m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_R, prefix + "cpow2_r", 1));
m_Params.push_back(ParamWithName<T>(&m_A, prefix + "cpow2_a"));
m_Params.push_back(ParamWithName<T>(&m_Divisor, prefix + "cpow2_divisor", 1, eParamType::INTEGER_NONZERO));
m_Params.push_back(ParamWithName<T>(&m_Spread, prefix + "cpow2_spread", 1, eParamType::INTEGER, 1, T(0x7FFFFFFF)));
m_Params.push_back(ParamWithName<T>(&m_Divisor, prefix + "cpow2_divisor", 1));
m_Params.push_back(ParamWithName<T>(&m_Spread, prefix + "cpow2_spread", 1));
m_Params.push_back(ParamWithName<T>(true, &m_C, prefix + "cpow2_c"));//Precalc.
m_Params.push_back(ParamWithName<T>(true, &m_HalfC, prefix + "cpow2_halfc"));
m_Params.push_back(ParamWithName<T>(true, &m_D, prefix + "cpow2_d"));