mirror of
https://bitbucket.org/mfeemster/fractorium.git
synced 2025-06-30 21:36:33 -04:00
--User changes
-Fix xform selection logic to prevent selecting hidden pre and post xforms. -Add hex_modulus. --Bug fixes -starblur was wrong. --Code changes -Optimize Truchet_hex_crop, Truchet_hex_fill. -Cleanup Truchet_inv. -Add new file Variations08.h, and move Gnarly and inkdrop there.
This commit is contained in:
@ -25,6 +25,7 @@ template EMBER_API class QTIsaac<ISAAC_SIZE, ISAAC_INT>;
|
||||
#include "Variations05.h"
|
||||
#include "Variations06.h"
|
||||
#include "Variations07.h"
|
||||
#include "Variations08.h"
|
||||
#include "VariationsDC.h"
|
||||
#include "VariationList.h"
|
||||
#include "Affine2D.h"
|
||||
@ -422,8 +423,8 @@ uint Timing::m_ProcessorCount;
|
||||
EXPORTPREPOSTREGVAR(TileHlp, T) \
|
||||
EXPORTPREPOSTREGVAR(Truchet, T) \
|
||||
EXPORTPREPOSTREGVAR(TruchetFill, T) \
|
||||
EXPORTPREPOSTREGVAR(TruchetHexFill, T) \
|
||||
EXPORTPREPOSTREGVAR(TruchetHexCrop, T) \
|
||||
EXPORTPREPOSTREGVAR(TruchetHexFill, T) \
|
||||
EXPORTPREPOSTREGVAR(TruchetHexCrop, T) \
|
||||
EXPORTPREPOSTREGVAR(TruchetGlyph, T) \
|
||||
EXPORTPREPOSTREGVAR(TruchetInv, T) \
|
||||
EXPORTPREPOSTREGVAR(TruchetKnot, T) \
|
||||
@ -493,6 +494,7 @@ uint Timing::m_ProcessorCount;
|
||||
EXPORTPREPOSTREGVAR(Waves4, T) \
|
||||
EXPORTPREPOSTREGVAR(Gnarly, T) \
|
||||
EXPORTPREPOSTREGVAR(Inkdrop, T) \
|
||||
EXPORTPREPOSTREGVAR(HexModulus, T) \
|
||||
template EMBER_API class VariationList<T>; \
|
||||
template EMBER_API class SpatialFilter<T>; \
|
||||
template EMBER_API class GaussianFilter<T>; \
|
||||
|
@ -37,7 +37,7 @@ static void sincos(float x, float* s, float* c)
|
||||
|
||||
namespace EmberNs
|
||||
{
|
||||
#define EMBER_VERSION "1.0.0.16"
|
||||
#define EMBER_VERSION "1.0.0.17"
|
||||
#define EPS6 T(1e-6)
|
||||
#define EPS std::numeric_limits<T>::epsilon()//Apoplugin.h uses -20, but it's more mathematically correct to do it this way.
|
||||
#define ISAAC_SIZE 4
|
||||
@ -52,10 +52,10 @@ 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_SQRT3 T(1.7320508075688772935274463415059)
|
||||
#define M_SQRT3_2 T(0.86602540378443864676372317075294)
|
||||
#define M_SQRT3_3 T(0.57735026918962576450914878050196)
|
||||
#define M_SQRT5 T(2.2360679774997896964091736687313)
|
||||
#define M_PHI T(1.61803398874989484820458683436563)
|
||||
#define M_1_2PI T(0.15915494309189533576888376337251)
|
||||
#define M_PI3 T(1.0471975511965977461542144610932)
|
||||
|
@ -225,6 +225,7 @@ enum class eVariationId : et
|
||||
VAR_HEXCROP ,
|
||||
VAR_HEXES ,
|
||||
VAR_HEXNIX3D ,
|
||||
VAR_HEX_MODULUS,
|
||||
VAR_HEX_RAND,
|
||||
VAR_HEX_TRUCHET,
|
||||
VAR_HO ,
|
||||
@ -423,8 +424,8 @@ enum class eVariationId : et
|
||||
VAR_TRADE ,
|
||||
VAR_TRUCHET,
|
||||
VAR_TRUCHET_FILL,
|
||||
VAR_TRUCHET_HEX_FILL,
|
||||
VAR_TRUCHET_HEX_CROP,
|
||||
VAR_TRUCHET_HEX_FILL,
|
||||
VAR_TRUCHET_HEX_CROP,
|
||||
VAR_TRUCHET_GLYPH,
|
||||
VAR_TRUCHET_INV,
|
||||
VAR_TRUCHET_KNOT,
|
||||
@ -643,6 +644,7 @@ enum class eVariationId : et
|
||||
VAR_PRE_HEXCROP,
|
||||
VAR_PRE_HEXES,
|
||||
VAR_PRE_HEXNIX3D,
|
||||
VAR_PRE_HEX_MODULUS,
|
||||
VAR_PRE_HEX_RAND,
|
||||
VAR_PRE_HEX_TRUCHET,
|
||||
VAR_PRE_HO,
|
||||
@ -840,8 +842,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_HEX_FILL,
|
||||
VAR_PRE_TRUCHET_HEX_CROP,
|
||||
VAR_PRE_TRUCHET_GLYPH,
|
||||
VAR_PRE_TRUCHET_INV,
|
||||
VAR_PRE_TRUCHET_KNOT,
|
||||
@ -1060,6 +1062,7 @@ enum class eVariationId : et
|
||||
VAR_POST_HEXCROP,
|
||||
VAR_POST_HEXES,
|
||||
VAR_POST_HEXNIX3D,
|
||||
VAR_POST_HEX_MODULUS,
|
||||
VAR_POST_HEX_RAND,
|
||||
VAR_POST_HEX_TRUCHET,
|
||||
VAR_POST_HO,
|
||||
@ -1257,8 +1260,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_HEX_FILL,
|
||||
VAR_POST_TRUCHET_HEX_CROP,
|
||||
VAR_POST_TRUCHET_GLYPH,
|
||||
VAR_POST_TRUCHET_INV,
|
||||
VAR_POST_TRUCHET_KNOT,
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "Variations05.h"
|
||||
#include "Variations06.h"
|
||||
#include "Variations07.h"
|
||||
#include "Variations08.h"
|
||||
#include "VariationsDC.h"
|
||||
|
||||
namespace EmberNs
|
||||
@ -308,8 +309,8 @@ VariationList<T>::VariationList()
|
||||
ADDPREPOSTREGVAR(BlurHeart)
|
||||
ADDPREPOSTREGVAR(Truchet)
|
||||
ADDPREPOSTREGVAR(TruchetFill)
|
||||
ADDPREPOSTREGVAR(TruchetHexFill)
|
||||
ADDPREPOSTREGVAR(TruchetHexCrop)
|
||||
ADDPREPOSTREGVAR(TruchetHexFill)
|
||||
ADDPREPOSTREGVAR(TruchetHexCrop)
|
||||
ADDPREPOSTREGVAR(TruchetGlyph)
|
||||
ADDPREPOSTREGVAR(TruchetInv)
|
||||
ADDPREPOSTREGVAR(TruchetKnot)
|
||||
@ -433,6 +434,7 @@ VariationList<T>::VariationList()
|
||||
ADDPREPOSTREGVAR(Waves42)
|
||||
ADDPREPOSTREGVAR(Gnarly)
|
||||
ADDPREPOSTREGVAR(Inkdrop)
|
||||
ADDPREPOSTREGVAR(HexModulus)
|
||||
//ADDPREPOSTREGVAR(LinearXZ)
|
||||
//ADDPREPOSTREGVAR(LinearYZ)
|
||||
//DC are special.
|
||||
|
@ -2458,7 +2458,7 @@ public:
|
||||
|
||||
virtual void Precalc() override
|
||||
{
|
||||
m_Five = 1 / SQRT5;
|
||||
m_Five = 1 / M_SQRT5;
|
||||
m_NatLog = std::log(M_PHI);
|
||||
}
|
||||
|
||||
@ -2534,7 +2534,7 @@ public:
|
||||
|
||||
virtual void Precalc() override
|
||||
{
|
||||
m_Five = 1 / SQRT5;
|
||||
m_Five = 1 / M_SQRT5;
|
||||
m_NatLog = std::log(M_PHI);
|
||||
}
|
||||
|
||||
|
@ -1149,15 +1149,16 @@ public:
|
||||
virtual void Func(IteratorHelper<T>& helper, Point<T>& outPoint, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand) override
|
||||
{
|
||||
T f = rand.Frand01<T>() * m_Power * 2;
|
||||
T angle = T(int(f));
|
||||
int intangle = int(f);
|
||||
T angle = T(intangle);
|
||||
f -= angle;
|
||||
T x = f * m_Length;
|
||||
T z = std::sqrt(1 + SQR(x) - 2 * x * std::cos(m_Alpha));
|
||||
|
||||
if (int(angle) & 1)
|
||||
angle = M_2PI / m_Power * (int(angle) / 2) + std::asin(std::sin(m_Alpha) * x / z);
|
||||
if (intangle & 1)
|
||||
angle = M_2PI / m_Power * (intangle / 2) + std::asin(std::sin(m_Alpha) * x / z);
|
||||
else
|
||||
angle = M_2PI / m_Power * (int(angle) / 2) - std::asin(std::sin(m_Alpha) * x / z);
|
||||
angle = M_2PI / m_Power * (intangle / 2) - std::asin(std::sin(m_Alpha) * x / z);
|
||||
|
||||
z *= std::sqrt(rand.Frand01<T>());
|
||||
T temp = angle - T(M_PI_2);
|
||||
@ -1179,17 +1180,18 @@ public:
|
||||
string alpha = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
|
||||
ss << "\t{\n"
|
||||
<< "\t\treal_t f = MwcNext01(mwc) * " << power << " * 2;\n"
|
||||
<< "\t\treal_t angle = (real_t)(int)(f);\n"
|
||||
<< "\t\tint intangle = (int)(f);\n"
|
||||
<< "\t\treal_t angle = (real_t)intangle;\n"
|
||||
<< "\n"
|
||||
<< "\t\tf -= angle;\n"
|
||||
<< "\n"
|
||||
<< "\t\treal_t x = f * " << length << ";\n"
|
||||
<< "\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 << ", ((int)angle) / 2, asin(sin(" << alpha << ") * x / z));\n"
|
||||
<< "\t\tif (intangle & 1)\n"
|
||||
<< "\t\t angle = fma(M_2PI / " << power << ", (real_t)(intangle / 2), asin(sin(" << alpha << ") * x / z));\n"
|
||||
<< "\t\telse\n"
|
||||
<< "\t\t angle = fma(M_2PI / " << power << ", ((int)angle) / 2, -asin(sin(" << alpha << ") * x / z));\n"
|
||||
<< "\t\t angle = fma(M_2PI / " << power << ", (real_t)(intangle / 2), -asin(sin(" << alpha << ") * x / z));\n"
|
||||
<< "\n"
|
||||
<< "\t\tz *= sqrt(MwcNext01(mwc));\n"
|
||||
<< "\n"
|
||||
@ -1214,10 +1216,10 @@ protected:
|
||||
{
|
||||
string prefix = Prefix();
|
||||
m_Params.clear();
|
||||
m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "starblur_power", 5, eParamType::INTEGER_NONZERO));
|
||||
m_Params.push_back(ParamWithName<T>(&m_Range, prefix + "starblur_range", T(0.4016228317)));
|
||||
m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "starblur_power", 5, eParamType::INTEGER_NONZERO));
|
||||
m_Params.push_back(ParamWithName<T>(&m_Range, prefix + "starblur_range", T(0.4016228317)));
|
||||
m_Params.push_back(ParamWithName<T>(true, &m_Length, prefix + "starblur_length"));//Precalc.
|
||||
m_Params.push_back(ParamWithName<T>(true, &m_Alpha, prefix + "starblur_alpha"));
|
||||
m_Params.push_back(ParamWithName<T>(true, &m_Alpha, prefix + "starblur_alpha"));
|
||||
}
|
||||
|
||||
private:
|
||||
|
File diff suppressed because it is too large
Load Diff
317
Source/Ember/Variations08.h
Normal file
317
Source/Ember/Variations08.h
Normal file
@ -0,0 +1,317 @@
|
||||
#pragma once
|
||||
|
||||
#include "Variation.h"
|
||||
|
||||
namespace EmberNs
|
||||
{
|
||||
/// <summary>
|
||||
/// Gnarly.
|
||||
/// </summary>
|
||||
template <typename T>
|
||||
class GnarlyVariation : public ParametricVariation<T>
|
||||
{
|
||||
public:
|
||||
GnarlyVariation(T weight = 1.0) : ParametricVariation<T>("gnarly", eVariationId::VAR_GNARLY, weight)
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
PARVARCOPY(GnarlyVariation)
|
||||
|
||||
virtual void Func(IteratorHelper<T>& helper, Point<T>& outPoint, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand) override
|
||||
{
|
||||
T Vx, Vy;
|
||||
T Cx, Cy;
|
||||
T Lx, Ly;
|
||||
T r, theta, s, c;
|
||||
Vx = helper.In.x;
|
||||
Vy = helper.In.y;
|
||||
|
||||
if (m_GnarlyCellSize != T(0))
|
||||
{
|
||||
Cx = (Floor<T>(Vx / m_GnarlyCellSize) + T(0.5)) * m_GnarlyCellSize;
|
||||
Cy = (Floor<T>(Vy / m_GnarlyCellSize) + T(0.5)) * m_GnarlyCellSize;
|
||||
Lx = Vx - Cx;
|
||||
Ly = Vy - Cy;
|
||||
|
||||
if ((Lx * Lx + Ly * Ly) <= m_R2)
|
||||
{
|
||||
r = (Lx * Lx + Ly * Ly) / m_R2;
|
||||
theta = m_GnarlyTwist * std::log(r);
|
||||
sincos(theta, &s, &c);
|
||||
Vx = Cx + c * Lx + s * Ly;
|
||||
Vy = Cy - s * Lx + c * Ly;
|
||||
}
|
||||
}
|
||||
|
||||
helper.Out.x = m_Weight * Vx;
|
||||
helper.Out.y = m_Weight * Vy;
|
||||
helper.Out.z = DefaultZ(helper);
|
||||
}
|
||||
|
||||
virtual string OpenCLString() const override
|
||||
{
|
||||
ostringstream ss, ss2;
|
||||
intmax_t i = 0, varIndex = IndexInXform();
|
||||
ss2 << "_" << XformIndexInEmber() << "]";
|
||||
string index = ss2.str();
|
||||
string weight = WeightDefineString();
|
||||
string cellsize = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
|
||||
string twist = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
|
||||
string r2 = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
|
||||
ss << "\t{\n"
|
||||
<< "\t\treal_t Vx, Vy, Cx, Cy, Lx, Ly, Lxy;\n"
|
||||
<< "\t\treal_t r, theta, s, c;\n"
|
||||
<< "\n"
|
||||
<< "\t\tVx = vIn.x;\n"
|
||||
<< "\t\tVy = vIn.y;\n"
|
||||
<< "\n"
|
||||
<< "\t\tif (" << cellsize << " != (real_t)(0))\n"
|
||||
<< "\t\t{\n"
|
||||
<< "\t\t\tCx = (floor(Vx / " << cellsize << ") + (real_t)(0.5)) * " << cellsize << ";\n"
|
||||
<< "\t\t\tCy = (floor(Vy / " << cellsize << ") + (real_t)(0.5)) * " << cellsize << ";\n"
|
||||
<< "\n"
|
||||
<< "\t\t\tLx = Vx - Cx;\n"
|
||||
<< "\t\t\tLy = Vy - Cy;\n"
|
||||
<< "\t\t\tLxy = fma(Lx, Lx, Ly * Ly);\n"
|
||||
<< "\n"
|
||||
<< "\t\t\tif (Lxy <= " << r2 << ")\n"
|
||||
<< "\t\t\t{\n"
|
||||
<< "\t\t\t\tr = Lxy / " << r2 << ";\n"
|
||||
<< "\t\t\t\ttheta = " << twist << " * log(r);\n"
|
||||
<< "\t\t\t\ts = sin(theta);\n"
|
||||
<< "\t\t\t\tc = cos(theta);\n"
|
||||
<< "\t\t\t\tVx = Cx + c * Lx + s * Ly;\n"
|
||||
<< "\t\t\t\tVy = Cy - s * Lx + c * Ly;\n"
|
||||
<< "\t\t\t}\n"
|
||||
<< "\t\t}\n"
|
||||
<< "\n"
|
||||
<< "\t\tvOut.x = " << weight << " * Vx;\n"
|
||||
<< "\t\tvOut.y = " << weight << " * Vy;\n"
|
||||
<< "\t\tvOut.z = " << DefaultZCl()
|
||||
<< "\t}\n";
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
virtual void Precalc() override
|
||||
{
|
||||
T radius = T(0.5) * m_GnarlyCellSize;
|
||||
m_R2 = Zeps(SQR(radius));
|
||||
}
|
||||
|
||||
protected:
|
||||
void Init()
|
||||
{
|
||||
string prefix = Prefix();
|
||||
m_Params.clear();
|
||||
m_Params.push_back(ParamWithName<T>(&m_GnarlyCellSize, prefix + "gnarly_cellsize", T(1)));
|
||||
m_Params.push_back(ParamWithName<T>(&m_GnarlyTwist, prefix + "gnarly_twist", T(1)));
|
||||
m_Params.push_back(ParamWithName<T>(true, &m_R2, prefix + "gnarly_r2"));//Precalc.
|
||||
}
|
||||
|
||||
private:
|
||||
T m_GnarlyCellSize;
|
||||
T m_GnarlyTwist;
|
||||
T m_R2;//Precalc.
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// inkdrop by Jess.
|
||||
/// </summary>
|
||||
template <typename T>
|
||||
class InkdropVariation : public ParametricVariation<T>
|
||||
{
|
||||
public:
|
||||
InkdropVariation(T weight = 1.0) : ParametricVariation<T>("inkdrop", eVariationId::VAR_INKDROP, weight)
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
PARVARCOPY(InkdropVariation)
|
||||
|
||||
virtual void Func(IteratorHelper<T>& helper, Point<T>& outPoint, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand) override
|
||||
{
|
||||
T distx = helper.In.x - m_X;
|
||||
T disty = helper.In.y - m_Y;
|
||||
T dist2 = SQR(distx) + SQR(disty);
|
||||
T adjust = std::sqrt(dist2 + m_Rad2) - std::sqrt(dist2);
|
||||
T bearing = std::atan2(disty, distx);
|
||||
T x = helper.In.x + (std::cos(bearing) * adjust);
|
||||
T y = helper.In.y + (std::sin(bearing) * adjust);
|
||||
helper.Out.x = m_Weight * x;
|
||||
helper.Out.y = m_Weight * y;
|
||||
helper.Out.z = DefaultZ(helper);
|
||||
}
|
||||
|
||||
virtual string OpenCLString() const override
|
||||
{
|
||||
ostringstream ss, ss2;
|
||||
intmax_t i = 0, varIndex = IndexInXform();
|
||||
ss2 << "_" << XformIndexInEmber() << "]";
|
||||
string index = ss2.str();
|
||||
string weight = WeightDefineString();
|
||||
string r = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
|
||||
string x = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
|
||||
string y = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
|
||||
string rad2 = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
|
||||
ss << "\t{\n"
|
||||
<< "\t\treal_t distx = vIn.x - " << x << ";\n"
|
||||
<< "\t\treal_t disty = vIn.y - " << y << ";\n"
|
||||
<< "\t\treal_t dist2 = SQR(distx) + SQR(disty);\n"
|
||||
<< "\t\treal_t adjust = sqrt(dist2 + " << rad2 << ") - sqrt(dist2);\n"
|
||||
<< "\n"
|
||||
<< "\t\treal_t bearing = atan2(disty, distx);\n"
|
||||
<< "\t\treal_t x = fma(cos(bearing), adjust, vIn.x);\n"
|
||||
<< "\t\treal_t y = fma(sin(bearing), adjust, vIn.y);\n"
|
||||
<< "\n"
|
||||
<< "\t\tvOut.x = " << weight << " * x;\n"
|
||||
<< "\t\tvOut.y = " << weight << " * y;\n"
|
||||
<< "\t\tvOut.z = " << DefaultZCl()
|
||||
<< "\t}\n";
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
virtual void Precalc() override
|
||||
{
|
||||
m_Rad2 = SQR(m_R);
|
||||
}
|
||||
|
||||
protected:
|
||||
void Init()
|
||||
{
|
||||
string prefix = Prefix();
|
||||
m_Params.clear();
|
||||
m_Params.push_back(ParamWithName<T>(&m_R, prefix + "inkdrop_r", T(0.5), eParamType::REAL, 0));
|
||||
m_Params.push_back(ParamWithName<T>(&m_X, prefix + "inkdrop_x"));
|
||||
m_Params.push_back(ParamWithName<T>(&m_Y, prefix + "inkdrop_y"));
|
||||
m_Params.push_back(ParamWithName<T>(true, &m_Rad2, prefix + "inkdrop_rad2"));//Precalc.
|
||||
}
|
||||
|
||||
private:
|
||||
T m_R;
|
||||
T m_X;
|
||||
T m_Y;
|
||||
T m_Rad2;//Precalc.
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// hex_modulus.
|
||||
/// By tatasz.
|
||||
/// </summary>
|
||||
template <typename T>
|
||||
class HexModulusVariation : public ParametricVariation<T>
|
||||
{
|
||||
public:
|
||||
HexModulusVariation(T weight = 1.0) : ParametricVariation<T>("hex_modulus", eVariationId::VAR_HEX_MODULUS, weight)
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
PARVARCOPY(HexModulusVariation)
|
||||
|
||||
virtual void Func(IteratorHelper<T>& helper, Point<T>& outPoint, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand) override
|
||||
{
|
||||
//get hex
|
||||
T X = helper.In.x * m_HsizePrecalc;
|
||||
T Y = helper.In.y * m_HsizePrecalc;
|
||||
T yover3 = Y / 3;
|
||||
T x = M_SQRT3_3 * X - yover3;
|
||||
T z = T(2.0) * yover3;
|
||||
T y = -x - z;
|
||||
//round
|
||||
T rx = std::round(x);
|
||||
T ry = std::round(y);
|
||||
T rz = std::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 = M_SQRT3 * rx + M_SQRT3_2 * rz;
|
||||
T FY_h = T(1.5) * rz;
|
||||
T FX = X - FX_h;
|
||||
T FY = Y - FY_h;
|
||||
helper.Out.x = FX * m_WeightPrecalc;
|
||||
helper.Out.y = FY * m_WeightPrecalc;
|
||||
helper.Out.z = DefaultZ(helper);
|
||||
}
|
||||
|
||||
virtual string OpenCLString() const override
|
||||
{
|
||||
ostringstream ss, ss2;
|
||||
intmax_t i = 0, varIndex = IndexInXform();
|
||||
ss2 << "_" << XformIndexInEmber() << "]";
|
||||
string index = ss2.str();
|
||||
string weight = WeightDefineString();
|
||||
string size = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
|
||||
string hsizeprecalc = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
|
||||
string weightprecalc = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
|
||||
ss << "\t{\n"
|
||||
<< "\t\t//get hex\n"
|
||||
<< "\t\treal_t X = vIn.x * " << hsizeprecalc << ";\n"
|
||||
<< "\t\treal_t Y = vIn.y * " << hsizeprecalc << ";\n"
|
||||
<< "\t\treal_t yover3 = Y / (real_t)(3.0);\n"
|
||||
<< "\t\treal_t x = fma(M_SQRT3_3, X, -yover3);\n"
|
||||
<< "\t\treal_t z = (real_t)(2.0) * yover3;\n"
|
||||
<< "\t\treal_t y = -x - z;\n"
|
||||
<< "\t\t//round\n"
|
||||
<< "\t\treal_t rx = round(x);\n"
|
||||
<< "\t\treal_t ry = round(y);\n"
|
||||
<< "\t\treal_t rz = round(z);\n"
|
||||
<< "\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\trx = -ry - rz;\n"
|
||||
<< "\t\telse if (y_diff > z_diff)\n"
|
||||
<< "\t\try = -rx - rz;\n"
|
||||
<< "\t\telse\n"
|
||||
<< "\t\trz = -rx - ry;\n"
|
||||
<< "\n"
|
||||
<< "\t\treal_t FX_h = fma(M_SQRT3, rx, M_SQRT3_2 * rz);\n"
|
||||
<< "\t\treal_t FY_h = (real_t)(1.5) * rz;\n"
|
||||
<< "\n"
|
||||
<< "\t\treal_t FX = X - FX_h;\n"
|
||||
<< "\t\treal_t FY = Y - FY_h;\n"
|
||||
<< "\n"
|
||||
<< "\t\tvOut.x = FX * " << weightprecalc << ";\n"
|
||||
<< "\t\tvOut.y = FY * " << weightprecalc << ";\n"
|
||||
<< "\t\tvOut.z = " << DefaultZCl()
|
||||
<< "\t}\n";
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
virtual void Precalc() override
|
||||
{
|
||||
m_HsizePrecalc = M_SQRT3_2 / Zeps(m_Size);
|
||||
m_WeightPrecalc = m_Weight / M_SQRT3_2;
|
||||
}
|
||||
|
||||
protected:
|
||||
void Init()
|
||||
{
|
||||
string prefix = Prefix();
|
||||
m_Params.clear();
|
||||
m_Params.push_back(ParamWithName<T>(&m_Size, prefix + "hex_modulus_size", T(1.0)));
|
||||
m_Params.push_back(ParamWithName<T>(true, &m_HsizePrecalc, prefix + "hex_modulus_hsize_precalc"));//Precalc.
|
||||
m_Params.push_back(ParamWithName<T>(true, &m_WeightPrecalc, prefix + "hex_modulus_weight_precalc"));
|
||||
}
|
||||
|
||||
private:
|
||||
T m_Size;
|
||||
T m_HsizePrecalc;//Precalc.
|
||||
T m_WeightPrecalc;
|
||||
};
|
||||
|
||||
MAKEPREPOSTPARVAR(Gnarly, gnarly, GNARLY)
|
||||
MAKEPREPOSTPARVAR(Inkdrop, inkdrop, INKDROP)
|
||||
MAKEPREPOSTPARVAR(HexModulus, hex_modulus, HEX_MODULUS)
|
||||
}
|
@ -81,12 +81,12 @@ 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_SQRT3 ((real_t)(1.7320508075688772935274463415059))\n"
|
||||
"#define M_SQRT3_2 ((real_t)(0.86602540378443864676372317075294))\n"
|
||||
"#define M_SQRT3_3 ((real_t)(0.57735026918962576450914878050196))\n"
|
||||
"#define M_SQRT5 ((real_t)(2.2360679774997896964091736687313))\n"
|
||||
"#define M_PHI ((real_t)(1.61803398874989484820458683436563))\n"
|
||||
"#define M_1_2PI ((real_t)(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"
|
||||
|
@ -58,7 +58,7 @@
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><html><head/><body><p align="center"><span style=" font-size:10pt;">Fractorium 1.0.0.16</span></p><p align="center"><span style=" font-size:10pt;">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"><a href="http://fractorium.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">fractorium.com</span></a></p></body></html></string>
|
||||
<string><html><head/><body><p align="center"><span style=" font-size:10pt;">Fractorium 1.0.0.17</span></p><p align="center"><span style=" font-size:10pt;">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"><a href="http://fractorium.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">fractorium.com</span></a></p></body></html></string>
|
||||
</property>
|
||||
<property name="textFormat">
|
||||
<enum>Qt::RichText</enum>
|
||||
|
@ -147,7 +147,8 @@ private:
|
||||
m4T m_Projection;
|
||||
|
||||
Affine2D<T> m_DragSrcTransform;
|
||||
vector<Affine2D<T>> m_DragSrcTransforms;
|
||||
std::map<size_t, Affine2D<T>> m_DragSrcPreTransforms;
|
||||
std::map<size_t, Affine2D<T>> m_DragSrcPostTransforms;
|
||||
|
||||
Xform<T>* m_HoverXform;
|
||||
Xform<T>* m_SelectedXform;
|
||||
|
@ -894,10 +894,14 @@ void GLEmberController<T>::MousePress(QMouseEvent* e)
|
||||
m_DragSrcTransform = Affine2D<T>(m_AffineType == eAffineType::AffinePre ? m_SelectedXform->m_Affine : m_SelectedXform->m_Post);//Copy the affine of the xform that was selected.
|
||||
//The user has selected an xform by clicking on it, so update the main GUI by selecting this xform in the combo box.
|
||||
m_Fractorium->CurrentXform(xformIndex);//Must do this first so UpdateXform() below properly grabs the current plus any selected.
|
||||
m_DragSrcTransforms.clear();
|
||||
m_DragSrcPreTransforms.clear();
|
||||
m_DragSrcPostTransforms.clear();
|
||||
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform, size_t xfindex, size_t selIndex)
|
||||
{
|
||||
m_DragSrcTransforms.push_back(m_AffineType == eAffineType::AffinePre ? xform->m_Affine : xform->m_Post);
|
||||
if (m_AffineType == eAffineType::AffinePre)
|
||||
m_DragSrcPreTransforms[xfindex] = xform->m_Affine;
|
||||
else
|
||||
m_DragSrcPostTransforms[xfindex] = xform->m_Post;
|
||||
}, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);//Don't update renderer here.
|
||||
m_DragHandlePos = m_HoverHandlePos;//The location in local coordinates of the point selected on the spinner, x, y or center.
|
||||
m_DragState = eDragState::DragDragging;
|
||||
@ -906,6 +910,8 @@ void GLEmberController<T>::MousePress(QMouseEvent* e)
|
||||
else//Nothing was selected.
|
||||
{
|
||||
//m_SelectedXform = nullptr;
|
||||
m_DragSrcPreTransforms.clear();
|
||||
m_DragSrcPostTransforms.clear();
|
||||
m_DragState = eDragState::DragNone;
|
||||
}
|
||||
}
|
||||
@ -1028,13 +1034,26 @@ void GLEmberController<T>::MouseMove(QMouseEvent* e)
|
||||
int i = 0;
|
||||
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform, size_t xfindex, size_t selIndex)
|
||||
{
|
||||
QPointF cd(xform->m_Affine.C() * scale, xform->m_Affine.F() * scale);
|
||||
bool b = qrf.contains(cd);
|
||||
m_FractoriumEmberController->XformCheckboxAt(i, [&](QCheckBox * cb)
|
||||
if (m_Fractorium->DrawAllPre() || xform == m_SelectedXform)//Draw all pre affine if specified.
|
||||
{
|
||||
cb->setChecked(b);
|
||||
});
|
||||
i++;
|
||||
QPointF cd(xform->m_Affine.C() * scale, xform->m_Affine.F() * scale);
|
||||
bool b = qrf.contains(cd);
|
||||
m_FractoriumEmberController->XformCheckboxAt(xfindex, [&](QCheckBox * cb)
|
||||
{
|
||||
cb->setChecked(b);
|
||||
});
|
||||
}
|
||||
|
||||
if (m_Fractorium->DrawAllPost() || xform == m_SelectedXform)
|
||||
{
|
||||
QPointF cd(xform->m_Post.C() * scale, xform->m_Post.F() * scale);
|
||||
bool b = qrf.contains(cd);
|
||||
m_FractoriumEmberController->XformCheckboxAt(xfindex, [&](QCheckBox * cb)
|
||||
{
|
||||
if (!cb->isChecked() && b)
|
||||
cb->setChecked(b);
|
||||
});
|
||||
}
|
||||
}, eXformUpdate::UPDATE_ALL, false);
|
||||
}
|
||||
else if (m_DragState == eDragState::DragPanning)//Translating the whole image.
|
||||
@ -1984,20 +2003,46 @@ void GLEmberController<T>::CalcDragXAxis()
|
||||
T angle = startAngle - endAngle;
|
||||
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform, size_t xfindex, size_t selIndex)
|
||||
{
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
auto src = m_DragSrcTransforms[selIndex];
|
||||
auto it = m_DragSrcPreTransforms.find(xfindex);
|
||||
|
||||
if (GetAlt())
|
||||
if (it != m_DragSrcPreTransforms.end() && (m_Fractorium->DrawAllPre() || xform == m_SelectedXform))
|
||||
{
|
||||
src.Rotate(angle);
|
||||
affine.X(src.X());
|
||||
auto src = it->second;
|
||||
auto& affine = xform->m_Affine;
|
||||
|
||||
if (GetAlt())
|
||||
{
|
||||
src.Rotate(angle);
|
||||
affine.X(src.X());
|
||||
}
|
||||
else
|
||||
{
|
||||
src.Rotate(angle);
|
||||
affine = src;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
it = m_DragSrcPostTransforms.find(xfindex);
|
||||
|
||||
if (it != m_DragSrcPostTransforms.end() && (m_Fractorium->DrawAllPost() || xform == m_SelectedXform))
|
||||
{
|
||||
src.Rotate(angle);
|
||||
affine = src;
|
||||
auto src = it->second;
|
||||
auto& affine = xform->m_Post;
|
||||
|
||||
if (GetAlt())
|
||||
{
|
||||
src.Rotate(angle);
|
||||
affine.X(src.X());
|
||||
}
|
||||
else
|
||||
{
|
||||
src.Rotate(angle);
|
||||
affine = src;
|
||||
}
|
||||
}
|
||||
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
|
||||
if (xform == m_FractoriumEmberController->CurrentXform())
|
||||
m_DragHandlePos = v3T((affine.O() + affine.X()) * worldToAffineScale, 0);
|
||||
}, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);//Calling code will update renderer.
|
||||
@ -2017,30 +2062,66 @@ void GLEmberController<T>::CalcDragXAxis()
|
||||
T angle = startAngle - endAngle;
|
||||
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform, size_t xfindex, size_t selIndex)
|
||||
{
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
auto src = m_DragSrcTransforms[selIndex];
|
||||
auto it = m_DragSrcPreTransforms.find(xfindex);
|
||||
|
||||
if (worldPivotShiftAlt)
|
||||
if (it != m_DragSrcPreTransforms.end() && (m_Fractorium->DrawAllPre() || xform == m_SelectedXform))
|
||||
{
|
||||
src.X(src.O() + src.X());
|
||||
src.O(v2T(0));
|
||||
src.Rotate(angle);
|
||||
affine.X(src.X() - affine.O());
|
||||
}
|
||||
else if (GetAlt())
|
||||
{
|
||||
affine.X(v2T(relScaled));//Absolute, not ratio.
|
||||
}
|
||||
else
|
||||
{
|
||||
src.ScaleXY(newprc);
|
||||
auto src = it->second;
|
||||
auto& affine = xform->m_Affine;
|
||||
|
||||
if (m_Fractorium->m_Settings->RotateAndScale())
|
||||
if (worldPivotShiftAlt)
|
||||
{
|
||||
src.X(src.O() + src.X());
|
||||
src.O(v2T(0));
|
||||
src.Rotate(angle);
|
||||
affine.X(src.X() - affine.O());
|
||||
}
|
||||
else if (GetAlt())
|
||||
{
|
||||
affine.X(v2T(relScaled));//Absolute, not ratio.
|
||||
}
|
||||
else
|
||||
{
|
||||
src.ScaleXY(newprc);
|
||||
|
||||
affine = src;
|
||||
if (m_Fractorium->m_Settings->RotateAndScale())
|
||||
src.Rotate(angle);
|
||||
|
||||
affine = src;
|
||||
}
|
||||
}
|
||||
|
||||
it = m_DragSrcPostTransforms.find(xfindex);
|
||||
|
||||
if (it != m_DragSrcPostTransforms.end() && (m_Fractorium->DrawAllPost() || xform == m_SelectedXform))
|
||||
{
|
||||
auto src = it->second;
|
||||
auto& affine = xform->m_Post;
|
||||
|
||||
if (worldPivotShiftAlt)
|
||||
{
|
||||
src.X(src.O() + src.X());
|
||||
src.O(v2T(0));
|
||||
src.Rotate(angle);
|
||||
affine.X(src.X() - affine.O());
|
||||
}
|
||||
else if (GetAlt())
|
||||
{
|
||||
affine.X(v2T(relScaled));//Absolute, not ratio.
|
||||
}
|
||||
else
|
||||
{
|
||||
src.ScaleXY(newprc);
|
||||
|
||||
if (m_Fractorium->m_Settings->RotateAndScale())
|
||||
src.Rotate(angle);
|
||||
|
||||
affine = src;
|
||||
}
|
||||
}
|
||||
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
|
||||
if (xform == m_FractoriumEmberController->CurrentXform())
|
||||
m_DragHandlePos = v3T((affine.O() + affine.X()) * worldToAffineScale, 0);
|
||||
}, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);
|
||||
@ -2087,20 +2168,46 @@ void GLEmberController<T>::CalcDragYAxis()
|
||||
T angle = startAngle - endAngle;
|
||||
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform, size_t xfindex, size_t selIndex)
|
||||
{
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
auto src = m_DragSrcTransforms[selIndex];
|
||||
auto it = m_DragSrcPreTransforms.find(xfindex);
|
||||
|
||||
if (GetAlt())
|
||||
if (it != m_DragSrcPreTransforms.end() && (m_Fractorium->DrawAllPre() || xform == m_SelectedXform))
|
||||
{
|
||||
src.Rotate(angle);
|
||||
affine.Y(src.Y());
|
||||
auto src = it->second;
|
||||
auto& affine = xform->m_Affine;
|
||||
|
||||
if (GetAlt())
|
||||
{
|
||||
src.Rotate(angle);
|
||||
affine.Y(src.Y());
|
||||
}
|
||||
else
|
||||
{
|
||||
src.Rotate(angle);
|
||||
affine = src;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
it = m_DragSrcPostTransforms.find(xfindex);
|
||||
|
||||
if (it != m_DragSrcPostTransforms.end() && (m_Fractorium->DrawAllPost() || xform == m_SelectedXform))
|
||||
{
|
||||
src.Rotate(angle);
|
||||
affine = src;
|
||||
auto src = it->second;
|
||||
auto& affine = xform->m_Post;
|
||||
|
||||
if (GetAlt())
|
||||
{
|
||||
src.Rotate(angle);
|
||||
affine.Y(src.Y());
|
||||
}
|
||||
else
|
||||
{
|
||||
src.Rotate(angle);
|
||||
affine = src;
|
||||
}
|
||||
}
|
||||
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
|
||||
if (xform == m_FractoriumEmberController->CurrentXform())
|
||||
m_DragHandlePos = v3T((affine.O() + affine.Y()) * worldToAffineScale, 0);
|
||||
}, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);//Calling code will update renderer.
|
||||
@ -2120,30 +2227,66 @@ void GLEmberController<T>::CalcDragYAxis()
|
||||
T angle = startAngle - endAngle;
|
||||
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform, size_t xfindex, size_t selIndex)
|
||||
{
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
auto src = m_DragSrcTransforms[selIndex];
|
||||
auto it = m_DragSrcPreTransforms.find(xfindex);
|
||||
|
||||
if (worldPivotShiftAlt)
|
||||
if (it != m_DragSrcPreTransforms.end() && (m_Fractorium->DrawAllPre() || xform == m_SelectedXform))
|
||||
{
|
||||
src.Y(src.O() + src.Y());
|
||||
src.O(v2T(0));
|
||||
src.Rotate(angle);
|
||||
affine.Y(src.Y() - affine.O());
|
||||
}
|
||||
else if (GetAlt())
|
||||
{
|
||||
affine.Y(v2T(relScaled));//Absolute, not ratio.
|
||||
}
|
||||
else
|
||||
{
|
||||
src.ScaleXY(newprc);
|
||||
auto src = it->second;
|
||||
auto& affine = xform->m_Affine;
|
||||
|
||||
if (m_Fractorium->m_Settings->RotateAndScale())
|
||||
if (worldPivotShiftAlt)
|
||||
{
|
||||
src.Y(src.O() + src.Y());
|
||||
src.O(v2T(0));
|
||||
src.Rotate(angle);
|
||||
affine.Y(src.Y() - affine.O());
|
||||
}
|
||||
else if (GetAlt())
|
||||
{
|
||||
affine.Y(v2T(relScaled));//Absolute, not ratio.
|
||||
}
|
||||
else
|
||||
{
|
||||
src.ScaleXY(newprc);
|
||||
|
||||
affine = src;
|
||||
if (m_Fractorium->m_Settings->RotateAndScale())
|
||||
src.Rotate(angle);
|
||||
|
||||
affine = src;
|
||||
}
|
||||
}
|
||||
|
||||
it = m_DragSrcPostTransforms.find(xfindex);
|
||||
|
||||
if (it != m_DragSrcPostTransforms.end() && (m_Fractorium->DrawAllPost() || xform == m_SelectedXform))
|
||||
{
|
||||
auto src = it->second;
|
||||
auto& affine = xform->m_Post;
|
||||
|
||||
if (worldPivotShiftAlt)
|
||||
{
|
||||
src.Y(src.O() + src.Y());
|
||||
src.O(v2T(0));
|
||||
src.Rotate(angle);
|
||||
affine.Y(src.Y() - affine.O());
|
||||
}
|
||||
else if (GetAlt())
|
||||
{
|
||||
affine.Y(v2T(relScaled));//Absolute, not ratio.
|
||||
}
|
||||
else
|
||||
{
|
||||
src.ScaleXY(newprc);
|
||||
|
||||
if (m_Fractorium->m_Settings->RotateAndScale())
|
||||
src.Rotate(angle);
|
||||
|
||||
affine = src;
|
||||
}
|
||||
}
|
||||
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
|
||||
if (xform == m_FractoriumEmberController->CurrentXform())
|
||||
m_DragHandlePos = v3T((affine.O() + affine.Y()) * worldToAffineScale, 0);
|
||||
}, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);
|
||||
@ -2179,21 +2322,46 @@ void GLEmberController<T>::CalcDragTranslation()
|
||||
T angle = startAngle - endAngle;
|
||||
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform, size_t xfindex, size_t selIndex)
|
||||
{
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
auto srcRotated = m_DragSrcTransforms[selIndex];
|
||||
srcRotated.RotateTrans(angle);
|
||||
auto it = m_DragSrcPreTransforms.find(xfindex);
|
||||
|
||||
if (worldPivotShift)
|
||||
if (it != m_DragSrcPreTransforms.end() && (m_Fractorium->DrawAllPre() || xform == m_SelectedXform))
|
||||
{
|
||||
srcRotated.Rotate(angle);
|
||||
affine.X(srcRotated.X());
|
||||
affine.Y(srcRotated.Y());
|
||||
auto src = it->second;
|
||||
auto& affine = xform->m_Affine;
|
||||
src.RotateTrans(angle);
|
||||
|
||||
if (worldPivotShift)
|
||||
{
|
||||
src.Rotate(angle);
|
||||
affine.X(src.X());
|
||||
affine.Y(src.Y());
|
||||
}
|
||||
|
||||
affine.O(src.O());
|
||||
}
|
||||
|
||||
affine.O(srcRotated.O());
|
||||
it = m_DragSrcPostTransforms.find(xfindex);
|
||||
|
||||
if (it != m_DragSrcPostTransforms.end() && (m_Fractorium->DrawAllPost() || xform == m_SelectedXform))
|
||||
{
|
||||
auto src = it->second;
|
||||
auto& affine = xform->m_Post;
|
||||
src.RotateTrans(angle);
|
||||
|
||||
if (worldPivotShift)
|
||||
{
|
||||
src.Rotate(angle);
|
||||
affine.X(src.X());
|
||||
affine.Y(src.Y());
|
||||
}
|
||||
|
||||
affine.O(src.O());
|
||||
}
|
||||
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
|
||||
if (xform == m_FractoriumEmberController->CurrentXform())
|
||||
m_DragHandlePos = v3T(srcRotated.O(), 0) * worldToAffineScale;
|
||||
m_DragHandlePos = v3T(affine.O(), 0) * worldToAffineScale;
|
||||
}, eXformUpdate::UPDATE_CURRENT_AND_SELECTED, false);//Calling code will update renderer.
|
||||
}
|
||||
else
|
||||
@ -2204,10 +2372,29 @@ void GLEmberController<T>::CalcDragTranslation()
|
||||
{
|
||||
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform, size_t xfindex, size_t selIndex)
|
||||
{
|
||||
auto it = m_DragSrcPreTransforms.find(xfindex);
|
||||
|
||||
if (it != m_DragSrcPreTransforms.end() && (m_Fractorium->DrawAllPre() || xform == m_SelectedXform))
|
||||
{
|
||||
auto& src = it->second;
|
||||
auto& affine = xform->m_Affine;
|
||||
auto offset = src.O() + (affineToWorldScale * v2T(diff));
|
||||
auto snapped = SnapToGrid(offset);
|
||||
affine.O(v2T(snapped.x, snapped.y));
|
||||
}
|
||||
|
||||
it = m_DragSrcPostTransforms.find(xfindex);
|
||||
|
||||
if (it != m_DragSrcPostTransforms.end() && (m_Fractorium->DrawAllPost() || xform == m_SelectedXform))
|
||||
{
|
||||
auto& src = it->second;
|
||||
auto& affine = xform->m_Post;
|
||||
auto offset = src.O() + (affineToWorldScale * v2T(diff));
|
||||
auto snapped = SnapToGrid(offset);
|
||||
affine.O(v2T(snapped.x, snapped.y));
|
||||
}
|
||||
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
auto offset = m_DragSrcTransforms[selIndex].O() + (affineToWorldScale * v2T(diff));
|
||||
auto snapped = SnapToGrid(offset);
|
||||
affine.O(v2T(snapped.x, snapped.y));
|
||||
|
||||
if (xform == m_FractoriumEmberController->CurrentXform())
|
||||
m_DragHandlePos = v3T(affine.O(), 0) * worldToAffineScale;
|
||||
@ -2217,8 +2404,25 @@ void GLEmberController<T>::CalcDragTranslation()
|
||||
{
|
||||
m_FractoriumEmberController->UpdateXform([&](Xform<T>* xform, size_t xfindex, size_t selIndex)
|
||||
{
|
||||
auto it = m_DragSrcPreTransforms.find(xfindex);
|
||||
|
||||
if (it != m_DragSrcPreTransforms.end() && (m_Fractorium->DrawAllPre() || xform == m_SelectedXform))
|
||||
{
|
||||
auto& src = it->second;
|
||||
auto& affine = xform->m_Affine;
|
||||
affine.O(src.O() + (affineToWorldScale * v2T(diff)));
|
||||
}
|
||||
|
||||
it = m_DragSrcPostTransforms.find(xfindex);
|
||||
|
||||
if (it != m_DragSrcPostTransforms.end() && (m_Fractorium->DrawAllPost() || xform == m_SelectedXform))
|
||||
{
|
||||
auto& src = it->second;
|
||||
auto& affine = xform->m_Post;
|
||||
affine.O(src.O() + (affineToWorldScale * v2T(diff)));
|
||||
}
|
||||
|
||||
auto& affine = pre ? xform->m_Affine : xform->m_Post;
|
||||
affine.O(m_DragSrcTransforms[selIndex].O() + (affineToWorldScale * v2T(diff)));
|
||||
|
||||
if (xform == m_FractoriumEmberController->CurrentXform())
|
||||
m_DragHandlePos = v3T(affine.O(), 0) * worldToAffineScale;
|
||||
|
@ -23,7 +23,9 @@ namespace apoconv
|
||||
//{ "0.0", "0" },
|
||||
{ "0.5", "T(0.5)" },
|
||||
{ "1.0", "T(1.0)" },
|
||||
{ "1.5", "T(1.5)" },
|
||||
{ "2.0", "T(2.0)" },
|
||||
{ "3.0", "T(3.0)" },
|
||||
{ "0.1", "T(0.1)" },
|
||||
{ "0.01", "T(0.01)" },
|
||||
{ "0.001", "T(0.001)" },
|
||||
@ -38,7 +40,8 @@ namespace apoconv
|
||||
{ "FPz", "helper.Out.z" },
|
||||
{ "VVAR", "m_Weight" },
|
||||
{ "floor(", "Floor<T>(" },
|
||||
{ "cel(", "std::ceil(" },
|
||||
{ "ceil(", "std::ceil(" },
|
||||
{ "round(", "std::round(" },
|
||||
{ "sin(", "std::sin(" },
|
||||
{ "sinh(", "std::sinh(" },
|
||||
{ "asin(", "std::asin(" },
|
||||
@ -58,11 +61,14 @@ namespace apoconv
|
||||
{ "sqrt(", "std::sqrt(" },
|
||||
{ "pow(", "std::pow(" },
|
||||
{ "fabs(", "std::abs(" },
|
||||
{ "abs(", "std::abs(" },
|
||||
{ "log(", "std::log(" },
|
||||
{ "exp(", "std::exp(" },
|
||||
|
||||
{ "sqr(", "Sqr(" },
|
||||
|
||||
{ "random01()", "rand.Frand01<T>()" },
|
||||
|
||||
{ "M_E", "T(M_E)" },
|
||||
{ "M_LOG2E", "T(M_LOG2E)" },
|
||||
{ "M_LOG10E", "T(M_LOG10E)" },
|
||||
@ -391,6 +397,11 @@ namespace apoconv
|
||||
final += "\t\tstring " + param.MemberName.Replace("m_", "").ToLower() + " = \"parVars[\" + ToUpper(m_Params[i++].Name()) + index;\r\n";
|
||||
}
|
||||
|
||||
foreach (var param in m_StructParams)
|
||||
{
|
||||
final += "\t\tstring " + param.MemberName.Replace("m_", "").ToLower() + " = \"parVars[\" + ToUpper(m_Params[i++].Name()) + index;\r\n";
|
||||
}
|
||||
|
||||
final += "\t\tss << \"\\t{\\n\"\r\n";
|
||||
|
||||
foreach (var line in m_FinalCalcFuncLines)
|
||||
@ -413,6 +424,7 @@ namespace apoconv
|
||||
Replace("std::abs", "fabs").
|
||||
Replace("m_Weight", "\" << weight << \"").
|
||||
Replace("std::", "").
|
||||
Replace("rand.Frand01<T>()", "MwcNext01(mwc)").
|
||||
Replace("T(", "(real_t)(")
|
||||
;
|
||||
|
||||
|
Reference in New Issue
Block a user