diff --git a/Source/Ember/Ember.cpp b/Source/Ember/Ember.cpp index 8acf510..5662d17 100644 --- a/Source/Ember/Ember.cpp +++ b/Source/Ember/Ember.cpp @@ -422,6 +422,8 @@ uint Timing::m_ProcessorCount; EXPORTPREPOSTREGVAR(TileHlp, T) \ EXPORTPREPOSTREGVAR(Truchet, T) \ EXPORTPREPOSTREGVAR(TruchetFill, T) \ + EXPORTPREPOSTREGVAR(TruchetHexFill, T) \ + EXPORTPREPOSTREGVAR(TruchetHexCrop, T) \ EXPORTPREPOSTREGVAR(TruchetGlyph, T) \ EXPORTPREPOSTREGVAR(TruchetInv, T) \ EXPORTPREPOSTREGVAR(TruchetKnot, T) \ diff --git a/Source/Ember/EmberDefines.h b/Source/Ember/EmberDefines.h index 2a0aa38..1d2bbee 100644 --- a/Source/Ember/EmberDefines.h +++ b/Source/Ember/EmberDefines.h @@ -52,9 +52,14 @@ namespace EmberNs #define M_3PI (T(M_PI * 3)) #define M_PI2 (T(M_PI_2)) #define M_PI4 (T(M_PI_4)) +#define SQRT3 T(1.7320508075688772935274463415059) +#define SQRT3_2 T(0.86602540378443864676372317075294) +#define SQRT3_3 T(0.57735026918962576450914878050196) #define SQRT5 T(2.2360679774997896964091736687313) #define M_PHI T(1.61803398874989484820458683436563) #define M_1_2PI T(0.15915494309189533576888376337251) +#define M_PI3 T(1.0471975511965977461542144610932) +#define M_PI6 T(0.52359877559829887307710723054658) #define COLORMAP_LENGTH 256//These will need to change if 2D palette support is ever added, or variable sized palettes. #define WHITE 255 #define DEFAULT_SBS (1024 * 10) diff --git a/Source/Ember/Variation.h b/Source/Ember/Variation.h index d52d4ab..f2a0b6a 100644 --- a/Source/Ember/Variation.h +++ b/Source/Ember/Variation.h @@ -423,6 +423,8 @@ enum class eVariationId : et VAR_TRADE , VAR_TRUCHET, VAR_TRUCHET_FILL, + VAR_TRUCHET_HEX_FILL, + VAR_TRUCHET_HEX_CROP, VAR_TRUCHET_GLYPH, VAR_TRUCHET_INV, VAR_TRUCHET_KNOT, @@ -838,6 +840,8 @@ enum class eVariationId : et VAR_PRE_TRADE, VAR_PRE_TRUCHET, VAR_PRE_TRUCHET_FILL, + VAR_PRE_TRUCHET_HEX_FILL, + VAR_PRE_TRUCHET_HEX_CROP, VAR_PRE_TRUCHET_GLYPH, VAR_PRE_TRUCHET_INV, VAR_PRE_TRUCHET_KNOT, @@ -1253,6 +1257,8 @@ enum class eVariationId : et VAR_POST_TRADE, VAR_POST_TRUCHET, VAR_POST_TRUCHET_FILL, + VAR_POST_TRUCHET_HEX_FILL, + VAR_POST_TRUCHET_HEX_CROP, VAR_POST_TRUCHET_GLYPH, VAR_POST_TRUCHET_INV, VAR_POST_TRUCHET_KNOT, diff --git a/Source/Ember/VariationList.cpp b/Source/Ember/VariationList.cpp index 5e10a63..723a4af 100644 --- a/Source/Ember/VariationList.cpp +++ b/Source/Ember/VariationList.cpp @@ -308,6 +308,8 @@ VariationList::VariationList() ADDPREPOSTREGVAR(BlurHeart) ADDPREPOSTREGVAR(Truchet) ADDPREPOSTREGVAR(TruchetFill) + ADDPREPOSTREGVAR(TruchetHexFill) + ADDPREPOSTREGVAR(TruchetHexCrop) ADDPREPOSTREGVAR(TruchetGlyph) ADDPREPOSTREGVAR(TruchetInv) ADDPREPOSTREGVAR(TruchetKnot) diff --git a/Source/Ember/Variations03.h b/Source/Ember/Variations03.h index f0f4460..0f6586d 100644 --- a/Source/Ember/Variations03.h +++ b/Source/Ember/Variations03.h @@ -1187,9 +1187,9 @@ public: << "\t\treal_t z = sqrt(fma(x, x, (real_t)(1.0)) - (real_t)(2.0) * x * cos(" << alpha << "));\n" << "\n" << "\t\tif (((int)angle) & 1)\n" - << "\t\t angle = fma(M_2PI / " << power << ", (real_t)(((int)angle) / (real_t)(2.0)), asin(sin(" << alpha << ") * x / z));\n" + << "\t\t angle = fma(M_2PI / " << power << ", ((int)angle) / 2, asin(sin(" << alpha << ") * x / z));\n" << "\t\telse\n" - << "\t\t angle = fma(M_2PI / " << power << ", (real_t)(((int)angle) / (real_t)(2.0)), -asin(sin(" << alpha << ") * x / z));\n" + << "\t\t angle = fma(M_2PI / " << power << ", ((int)angle) / 2, -asin(sin(" << alpha << ") * x / z));\n" << "\n" << "\t\tz *= sqrt(MwcNext01(mwc));\n" << "\n" diff --git a/Source/Ember/Variations07.h b/Source/Ember/Variations07.h index a74839c..0504aef 100644 --- a/Source/Ember/Variations07.h +++ b/Source/Ember/Variations07.h @@ -1324,6 +1324,7 @@ public: helper.Out.x = x1 - helper.In.x; helper.Out.y = y1 - helper.In.y; } + helper.Out.z = DefaultZ(helper); } virtual string OpenCLString() const override @@ -1455,9 +1456,9 @@ protected: { string prefix = Prefix(); m_Params.clear(); - m_Params.push_back(ParamWithName(&m_Exponent, prefix + "Truchet_fill_exponent", 2, eParamType::REAL_CYCLIC, T(0.001), 2)); - m_Params.push_back(ParamWithName(&m_ArcWidth, prefix + "Truchet_fill_arc_width", T(0.5), eParamType::REAL_CYCLIC, T(0.001), 1)); - m_Params.push_back(ParamWithName(&m_Seed, prefix + "Truchet_fill_seed")); + m_Params.push_back(ParamWithName(&m_Exponent, prefix + "Truchet_fill_exponent", 2, eParamType::REAL_CYCLIC, T(0.001), 2)); + m_Params.push_back(ParamWithName(&m_ArcWidth, prefix + "Truchet_fill_arc_width", T(0.5), eParamType::REAL_CYCLIC, T(0.001), 1)); + m_Params.push_back(ParamWithName(&m_Seed, prefix + "Truchet_fill_seed")); m_Params.push_back(ParamWithName(true, &m_FinalExponent, prefix + "Truchet_fill_final_exponent"));//Precalc m_Params.push_back(ParamWithName(true, &m_OneOverEx, prefix + "Truchet_fill_oneoverex")); m_Params.push_back(ParamWithName(true, &m_Width, prefix + "Truchet_fill_width")); @@ -1478,6 +1479,462 @@ private: T m_Scale; }; +/// +/// Truchet_hex_fill. +/// By tatasz. +/// http://fav.me/dd9ay2c +/// +template +class TruchetHexFillVariation : public ParametricVariation +{ +public: + TruchetHexFillVariation(T weight = 1.0) : ParametricVariation("Truchet_hex_fill", eVariationId::VAR_TRUCHET_HEX_FILL, weight) + { + Init(); + } + + PARVARCOPY(TruchetHexFillVariation) + + virtual void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) override + { + //round + T rx = Floor(std::log(rand.Frand01()) * (rand.Frand01() < T(0.5) ? m_SpreadX : -m_SpreadX)); + T rz = Floor(std::log(rand.Frand01()) * (rand.Frand01() < T(0.5) ? m_SpreadY : -m_SpreadY)); + + T fx_h = SQRT3 * rx + SQRT3_2 * (rand.Frand01() < T(0.5) ? rz : -rz); + T fy_h = T(1.5) * rz; + + bool add = true; + + if (m_Seed == T(1)) + { + if (((((int) rx) % 2) == 0) && ((((int) rz) % 2) == 0)) + add = false; + } + else if (m_Seed >= T(2)) + { + T hash_f = std::sin(fx_h * T(12.9898) + fy_h * T(78.233) + m_Seed) * T(43758.5453); + hash_f = hash_f - Floor(hash_f); + if (hash_f < T(0.5)) + add = false; + } + + //exponential to make a tiled circle + T rangle = floor(rand.Frand01() * m_3N) * M_2PI * m_1_3N; + T x_aux = m_FlipX ? (add ? helper.In.x : -helper.In.x) : helper.In.x; + T y_aux = m_FlipY ? (add ? helper.In.y : -helper.In.y) : helper.In.y; + T fx = x_aux * m_1_3N; + T fy = y_aux * m_1_3N; + + T ang = fy * M_PI + rangle; + T a = T(1) + fx * M_PI; + fx = a * std::cos(ang); + fy = a * std::sin(ang); + + //split + T a2 = std::atan2(fy, fx); + + if (a2 < T(0)) + a2 += M_2PI; + + ang = (M_PI + Floor(T(1.5) * a2 * M_1_PI) * M_2PI) / T(3.0); + + T fx_new = fx - std::cos(ang) * T(2); + T fy_new = fy - std::sin(ang) * T(2); + + //rotate by 30 to fit the hex + if (add) + { + fx = SQRT3_2 * fx_new - T(0.5) * fy_new; + fy = 0.5 * fx_new + SQRT3_2 * fy_new; + } + else + { + fx = SQRT3_2 * fx_new + T(0.5) * fy_new; + fy = -T(0.5) * fx_new + SQRT3_2 * fy_new; + } + + helper.Out.x = (fx * T(0.5) + fx_h) * m_Weight; + helper.Out.y = (fy * T(0.5) + fy_h) * m_Weight; + helper.Out.z = DefaultZ(helper); + } + + virtual string OpenCLString() const override + { + ostringstream ss, ss2; + intmax_t i = 0; + ss2 << "_" << XformIndexInEmber() << "]"; + string index = ss2.str(); + string weight = WeightDefineString(); + string pN = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string flipX = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string flipY = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string spreadX = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string spreadY = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string seed = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string p3N = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string p1_3N = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + ss << "\t{\n" + << "\t\treal_t rx = floor(log(MwcNext01(mwc)) * (MwcNext01(mwc) < (real_t)(0.5) ? " << m_SpreadX << " : -" << m_SpreadX << "));\n" + << "\t\treal_t rz = floor(log(MwcNext01(mwc)) * (MwcNext01(mwc) < (real_t)(0.5) ? " << m_SpreadY << " : -" << m_SpreadY << "));\n" + << "\n" + << "\t\treal_t fx_h = SQRT3 * rx + SQRT3_2 * (MwcNext01(mwc) < (real_t)(0.5) ? rz : -rz);\n" + << "\t\treal_t fy_h = (real_t)(1.5) * rz;\n" + << "\n" + << "\t\tbool add = true;\n" + << "\n" + << "\t\tif (" << seed << " == (real_t)(1))\n" + << "\t\t{\n" + << "\t\t if (((((int) rx) % 2) == 0) && ((((int) rz) % 2) == 0))\n" + << "\t\t add = false;\n" + << "\t\t}\n" + << "\t\telse if (" << seed << " >= (real_t)(2))\n" + << "\t\t{\n" + << "\t\t real_t hash_f = sin(fx_h * (real_t)(12.9898) + fy_h * (real_t)(78.233) + " << seed << ") * (real_t)(43758.5453);\n" + << "\t\t hash_f = hash_f - floor(hash_f);\n" + << "\t\t if (hash_f < (real_t)(0.5))\n" + << "\t\t add = false;\n" + << "\t\t}\n" + << "\n" + << "\t\treal_t rangle = floor(MwcNext01(mwc) * " << p3N << ") * M_2PI * " << p1_3N << ";\n" + << "\t\treal_t x_aux = " << flipX << " ? (add ? vIn.x : -vIn.x) : vIn.x;\n" + << "\t\treal_t y_aux = " << flipY << " ? (add ? vIn.y : -vIn.y) : vIn.y;\n" + << "\t\treal_t fx = x_aux * " << p1_3N << ";\n" + << "\t\treal_t fy = y_aux * " << p1_3N << ";\n" + << "\n" + << "\t\treal_t ang = fy * M_PI + rangle;\n" + << "\t\treal_t a = (real_t)(1) + fx * M_PI;\n" + << "\t\tfx = a * cos(ang);\n" + << "\t\tfy = a * sin(ang);\n" + << "\n" + << "\t\treal_t a2 = atan2(fy, fx);\n" + << "\n" + << "\t\tif (a2 < (real_t)(0))\n" + << "\t\t a2 += M_2PI;\n" + << "\n" + << "\t\tang = (M_PI + floor((real_t)(1.5) * a2 * M_1_PI) * M_2PI) / (real_t)(3.0);\n" + << "\n" + << "\t\treal_t fx_new = fx - cos(ang) * (real_t)(2);\n" + << "\t\treal_t fy_new = fy - sin(ang) * (real_t)(2);\n" + << "\n" + << "\t\tif (add)\n" + << "\t\t{\n" + << "\t\t fx = SQRT3_2 * fx_new - (real_t)(0.5) * fy_new;\n" + << "\t\t fy = 0.5 * fx_new + SQRT3_2 * fy_new;\n" + << "\t\t}\n" + << "\t\telse\n" + << "\t\t{\n" + << "\t\t fx = SQRT3_2 * fx_new + (real_t)(0.5) * fy_new;\n" + << "\t\t fy = -(real_t)(0.5) * fx_new + SQRT3_2 * fy_new;\n" + << "\t\t}\n" + << "\n" + << "\t\tvOut.x = (fx * (real_t)(0.5) + fx_h) * " << weight << ";\n" + << "\t\tvOut.y = (fy * (real_t)(0.5) + fy_h) * " << weight << ";\n" + << "\n" + << "\t\tvOut.z = " << DefaultZCl() + << "\t}\n"; + return ss.str(); + } + + virtual void Precalc() override + { + m_3N = T(3.0) * m_N; + m_1_3N = T(1.0) / m_3N; + } + +protected: + void Init() + { + string prefix = Prefix(); + m_Params.clear(); + m_Params.push_back(ParamWithName(&m_N, prefix + "Truchet_hex_fill_n", 3)); + m_Params.push_back(ParamWithName(&m_FlipX, prefix + "Truchet_hex_fill_flipx", 1, eParamType::INTEGER, 0, 1)); + m_Params.push_back(ParamWithName(&m_FlipY, prefix + "Truchet_hex_fill_flipy", 1, eParamType::INTEGER, 0, 1)); + m_Params.push_back(ParamWithName(&m_SpreadX, prefix + "Truchet_hex_fill_spreadx", 1)); + m_Params.push_back(ParamWithName(&m_SpreadY, prefix + "Truchet_hex_fill_spready", 1)); + m_Params.push_back(ParamWithName(&m_Seed, prefix + "Truchet_hex_fill_seed")); + m_Params.push_back(ParamWithName(true, &m_3N, prefix + "Truchet_hex_fill_3N"));//Precalc + m_Params.push_back(ParamWithName(true, &m_1_3N, prefix + "Truchet_hex_fill_1_3N")); + } + +private: + T m_N; + T m_FlipX; + T m_FlipY; + T m_SpreadX; + T m_SpreadY; + T m_Seed; + T m_3N;//Precalc. + T m_1_3N; +}; + +/// +/// Truchet_hex_crop. +/// By tatasz. +/// http://fav.me/dd9ay2c +/// +template +class TruchetHexCropVariation : public ParametricVariation +{ +public: + TruchetHexCropVariation(T weight = 1.0) : ParametricVariation("Truchet_hex_crop", eVariationId::VAR_TRUCHET_HEX_CROP, weight) + { + Init(); + } + + PARVARCOPY(TruchetHexCropVariation) + + virtual void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) override + { + //get hex + T x = SQRT3_3 * helper.In.x - helper.In.y / T(3.0); + T z = T(2.0) * helper.In.y / T(3.0); + T y = -x - z; + + //round + T rx = Round(x); + T ry = Round(y); + T rz = Round(z); + + T x_diff = std::abs(rx - x); + T y_diff = std::abs(ry - y); + T z_diff = std::abs(rz - z); + + if ((x_diff > y_diff) && (x_diff > z_diff)) + rx = -ry-rz; + else if (y_diff > z_diff) + ry = -rx-rz; + else + rz = -rx-ry; + + T fx_h = SQRT3 * rx + SQRT3_2 * rz; + T fy_h = T(1.5) * rz; + + T fx = helper.In.x - fx_h; + T fy = helper.In.y - fy_h; + + T add = 0; + + if (m_Seed == T(1)) + { + if (((((int) rx) % 2) == 0) && ((((int) rz) % 2) == 0)) + add = M_PI3; + } + else if (m_Seed >= T(2)) + { + T hash_f = std::sin(fx_h * T(12.9898) + fy_h * T(78.233) + m_Seed) * T(43758.5453); + hash_f = hash_f - Floor(hash_f); + if (hash_f < T(0.5)) + add = M_PI3; + } + + T angle = std::atan2(fy, fx) + M_PI6 - add; + T angle2 = Floor(angle * m_Coef) / m_Coef + M_PI6 + add; //or subtract 0.5 + T x0 = std::cos(angle2); + T y0 = std::sin(angle2); + T dist = std::sqrt(SQR(fx - x0) + SQR(fy - y0)); + + if (m_Inv) + { + if ((dist > m_D1) || (dist < m_D2)) + { + if (m_Mode < T(0.5)) + { + fx = 0; + fy = 0; + } + else if (m_Mode < T(1.5)) + { + fx = x0; + fy = y0; + } + else + { + T rangle = std::atan2(fy - y0, fx - x0); + T d = (rand.Frand01() < T(0.5)) ? m_D1 : m_D2; + fx = x0 + std::cos(rangle) * d; + fy = y0 + std::sin(rangle) * d; + } + } + + } + else + { + if ((dist < m_D1) && (dist > m_D2)) + { + if (m_Mode < T(0.5)) + { + fx = 0; + fy = 0; + } + else if (m_Mode < T(1.5)) + { + fx = x0; + fy = y0; + } + else + { + T rangle = std::atan2(fy - y0, fx - x0); + T d = (rand.Frand01() < T(0.5)) ? m_D1 : m_D2; + fx = x0 + std::cos(rangle) * d; + fy = y0 + std::sin(rangle) * d; + } + } + } + + helper.Out.x = (fx + fx_h) * m_Weight; + helper.Out.y = (fy + fy_h) * m_Weight; + helper.Out.z = DefaultZ(helper); + } + + virtual string OpenCLString() const override + { + ostringstream ss, ss2; + intmax_t i = 0; + ss2 << "_" << XformIndexInEmber() << "]"; + string index = ss2.str(); + string weight = WeightDefineString(); + string wd = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string mode = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string inv = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string seed = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string d1 = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string d2 = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string coef = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + ss << "\t{\n" + << "\t\treal_t x = SQRT3_3 * vIn.x - vIn.y / (real_t)(3.0);\n" + << "\t\treal_t z = (real_t)(2.0) * vIn.y / (real_t)(3.0);\n" + << "\t\treal_t y = -x - z;\n" + << "\t\treal_t rx = Round(x);\n" + << "\t\treal_t ry = Round(y);\n" + << "\t\treal_t rz = Round(z);\n" + << "\t\treal_t x_diff = fabs(rx - x);\n" + << "\t\treal_t y_diff = fabs(ry - y);\n" + << "\t\treal_t z_diff = fabs(rz - z);\n" + << "\n" + << "\t\tif ((x_diff > y_diff) && (x_diff > z_diff))\n" + << "\t\t rx = -ry-rz;\n" + << "\t\telse if (y_diff > z_diff)\n" + << "\t\t ry = -rx-rz;\n" + << "\t\telse\n" + << "\t\trz = -rx-ry;\n" + << "\n" + << "\t\treal_t fx_h = SQRT3 * rx + SQRT3_2 * rz;\n" + << "\t\treal_t fy_h = (real_t)(1.5) * rz;\n" + << "\t\treal_t fx = vIn.x - fx_h;\n" + << "\t\treal_t fy = vIn.y - fy_h;\n" + << "\t\treal_t add = 0;\n" + << "\n" + << "\t\tif (" << seed << " == (real_t)(1))\n" + << "\t\t{\n" + << "\t\t if (((((int) rx) % 2) == 0) && ((((int) rz) % 2) == 0))\n" + << "\t\t add = M_PI3;\n" + << "\t\t}\n" + << "\t\telse if (" << seed << " >= (real_t)(2))\n" + << "\t\t{\n" + << "\t\t real_t hash_f = sin(fx_h * (real_t)(12.9898) + fy_h * (real_t)(78.233) + " << seed << ") * (real_t)(43758.5453);\n" + << "\t\t hash_f = hash_f - floor(hash_f);\n" + << "\t\t if (hash_f < (real_t)(0.5))\n" + << "\t\t add = M_PI3;\n" + << "\t\t}\n" + << "\n" + << "\t\treal_t angle = atan2(fy, fx) + M_PI6 - add;\n" + << "\t\treal_t angle2 = floor(angle * " << coef << ") / " << coef << " + M_PI6 + add;\n" + << "\t\treal_t x0 = cos(angle2);\n" + << "\t\treal_t y0 = sin(angle2);\n" + << "\t\treal_t dist = sqrt(SQR(fx - x0) + SQR(fy - y0));\n" + << "\n" + << "\t\tif (" << inv << ")\n" + << "\t\t{\n" + << "\t\t if ((dist > " << d1 << ") || (dist < " << d2 << "))\n" + << "\t\t {\n" + << "\t\t if (" << mode << " < (real_t)(0.5))\n" + << "\t\t {\n" + << "\t\t fx = 0;\n" + << "\t\t fy = 0;\n" + << "\t\t }\n" + << "\t\t else if (" << mode << " < (real_t)(1.5))\n" + << "\t\t {\n" + << "\t\t fx = x0;\n" + << "\t\t fy = y0;\n" + << "\t\t }\n" + << "\t\t else\n" + << "\t\t {\n" + << "\t\t real_t rangle = atan2(fy - y0, fx - x0);\n" + << "\t\t real_t d = (MwcNext01(mwc) < (real_t)(0.5)) ? " << d1 << " : " << d2 << ";\n" + << "\t\t fx = x0 + cos(rangle) * d;\n" + << "\t\t fy = y0 + sin(rangle) * d;\n" + << "\t\t }\n" + << "\t\t }\n" + << "\t\t}\n" + << "\t\telse\n" + << "\t\t{\n" + << "\t\t if ((dist < " << d1 << ") && (dist > " << d2 << "))\n" + << "\t\t {\n" + << "\t\t if (" << mode << " < (real_t)(0.5))\n" + << "\t\t {\n" + << "\t\t fx = 0;\n" + << "\t\t fy = 0;\n" + << "\t\t }\n" + << "\t\t else if (" << mode << " < (real_t)(1.5))\n" + << "\t\t {\n" + << "\t\t fx = x0;\n" + << "\t\t fy = y0;\n" + << "\t\t }\n" + << "\t\t else\n" + << "\t\t {\n" + << "\t\t real_t rangle = atan2(fy - y0, fx - x0);\n" + << "\t\t real_t d = (MwcNext01(mwc) < (real_t)(0.5)) ? " << d1 << " : " << d2 << ";\n" + << "\t\t fx = x0 + cos(rangle) * d;\n" + << "\t\t fy = y0 + sin(rangle) * d;\n" + << "\t\t }\n" + << "\t\t }\n" + << "\t\t}\n" + << "\n" + << "\t\t\tvOut.x = (fx + fx_h) * " << weight << ";\n" + << "\t\t\tvOut.y = (fy + fy_h) * " << weight << ";\n" + << "\n" + << "\t\tvOut.z = " << DefaultZCl() + << "\t}\n"; + return ss.str(); + } + + virtual vector OpenCLGlobalFuncNames() const override + { + return vector { "Round" }; + } + + virtual void Precalc() override + { + m_D1 = T(0.5) + m_Wd; + m_D2 = T(0.5) - m_Wd; + m_Coef = T(1.5) / T(M_PI); + } + +protected: + void Init() + { + string prefix = Prefix(); + m_Params.clear(); + m_Params.push_back(ParamWithName(&m_Wd, prefix + "Truchet_hex_crop_wd", T(0.2), eParamType::REAL_CYCLIC, 0, 5)); + m_Params.push_back(ParamWithName(&m_Mode, prefix + "Truchet_hex_crop_mode", 0, eParamType::INTEGER, 0, 2)); + m_Params.push_back(ParamWithName(&m_Inv, prefix + "Truchet_hex_crop_inv", 0, eParamType::INTEGER, 0, 1)); + m_Params.push_back(ParamWithName(&m_Seed, prefix + "Truchet_hex_crop_seed")); + m_Params.push_back(ParamWithName(true, &m_D1, prefix + "Truchet_hex_crop_d1"));//Precalc + m_Params.push_back(ParamWithName(true, &m_D2, prefix + "Truchet_hex_crop_d2")); + m_Params.push_back(ParamWithName(true, &m_Coef, prefix + "Truchet_hex_crop_coef")); + } + +private: + T m_Wd; + T m_Mode; + T m_Inv; + T m_Seed; + T m_D1;//Precalc. + T m_D2; + T m_Coef; +}; + /// /// waves2_radial. /// By tatasz. @@ -7285,6 +7742,8 @@ MAKEPREPOSTVAR(Cylinder2, cylinder2, CYLINDER2) MAKEPREPOSTPARVAR(TileLog, tile_log, TILE_LOG) MAKEPREPOSTPARVAR(TileHlp, tile_hlp, TILE_HLP) MAKEPREPOSTPARVAR(TruchetFill, Truchet_fill, TRUCHET_FILL) +MAKEPREPOSTPARVAR(TruchetHexFill, Truchet_hex_fill, TRUCHET_HEX_FILL) +MAKEPREPOSTPARVAR(TruchetHexCrop, Truchet_hex_crop, TRUCHET_HEX_CROP) MAKEPREPOSTPARVAR(Waves2Radial, waves2_radial, WAVES2_RADIAL) MAKEPREPOSTVAR(Panorama1, panorama1, PANORAMA1) MAKEPREPOSTVAR(Panorama2, panorama2, PANORAMA2) diff --git a/Source/EmberCL/EmberCLStructs.h b/Source/EmberCL/EmberCLStructs.h index ff0a917..94f97cc 100644 --- a/Source/EmberCL/EmberCLStructs.h +++ b/Source/EmberCL/EmberCLStructs.h @@ -81,9 +81,14 @@ static string ConstantDefinesString(bool doublePrecision) "#define M2PI ((real_t)M_2_PI)\n" "#define M_2PI (MPI * 2)\n" "#define M_3PI (MPI * 3)\n" + "#define SQRT3 ((real_t)(1.7320508075688772935274463415059))\n" + "#define SQRT3_2 ((real_t)(0.86602540378443864676372317075294))\n" + "#define SQRT3_3 ((real_t)(0.57735026918962576450914878050196))\n" "#define SQRT5 2.2360679774997896964091736687313\n" "#define M_PHI 1.61803398874989484820458683436563\n" "#define M_1_2PI 0.15915494309189533576888376337251\n" + "#define M_PI3 ((real_t)(1.0471975511965977461542144610932))\n" + "#define M_PI6 ((real_t)(0.52359877559829887307710723054658))\n" "#define DEG_2_RAD (MPI / 180)\n" "#define CURVES_LENGTH_M1 ((real_bucket_t)" << CURVES_LENGTH_M1 << ")\n" << "#define ONE_OVER_CURVES_LENGTH_M1 ((real_bucket_t)" << ONE_OVER_CURVES_LENGTH_M1 << ")\n" <<