This is an attempt at the formula part of a .frag. (I don't know enough yet about programming for fragmentarium)
If you can get it to work, please post back the corrected .frag so i can see my mistakes.
I have been using it to make hybrids with aSurf, pseudoKlienianMod, and MengerMods
This image is with gap.y set at 1.99, the rest of parameters at default.
#info CrossMengerMod1
#include "DE-Raytracer.frag"
#group CrossMenger
// Number of fractal iterations.
uniform float Scale; slider[0.,1.,2.]
uniform float ScaleY; slider[0.,1.,2.]
uniform float ScaleZ; slider[0.,1.,2.]
uniform int iter; slider[0, 12, 250}
uniform float3 gap; slider[(-1.,-1.,-1.),(0.,0.,0.),(3.,2.,3.] gap = offset scale,
uniform bool Mod; checkbox[false] // this works only with some settings
const float SQRT_3_4 = 0.86602540378443864676372317075294;
const float SQRT_3 = 1.73205080756887729352744634150587;
float t;
float temp;
float dot1;
const float DE = 1.0;
const float Bailout = 10.0;
vec3 z = p;
uniform vec3 RotVector; slider[(0,0,0),(1,1,1),(1,1,1)]
uniform float RotAngle; slider[0.00,0,180]
mat3 rot;
void init() {
rot = rotationMatrix3(normalize(RotVector), RotAngle);
}
void CrossMengerMod1( vec3 z)
{
z.z = abs(z.z);
dot1 = (z.x * -SQRT_3_4 + z.y * 0.5) * Scale;
t = max(0.0, dot1);
z.x -= t * -SQRT_3 - (0.5 * SQRT_3_4);
z.y = abs(z.y - t);
if (z.y > z.z)
{
temp = z.y;
z.y = z.z;
z.z = temp;
}
z.y -= 1.5;
z -= gap * vec3(SQRT_3_4, -1.5, 1.5);
if (z.z > z.x)
{
temp = z.z;
z.z = z.x;
z.x = temp;
}
if(Mod)
{
if (z.x >= 0.0)
{
z.y = max(0.0, z.y) * ScaleY;
z.z = max(0.0, z.z) * ScaleZ;
}
z *= rot;
}
for(int i=0; i< iter; i++)
{ // CrossMengerTrick
z.y = abs(z.y);
z.z = abs(z.z);
dot1 = (z.x * -SQRT_3_4 + z.y * 0.5);
float t = 1 * max(0.0, dot1);
z.x -= t * -SQRT_3;
z.x -= SQRT_3_4;
float dy = 0.0;
float dz = 0.0;
if (z.y > 0.5 && z.z > 0.5)
{
dy = 1.5;
dz = 1.5;
}
else if
((z.y - 1.5) * (z.y - 1.5) + z.z * z.z < z.y * z.y + (z.z - 1.5) * (z.z - 1.5))
{
dy = 1.5;
}
else
dz = 1.5;
z.y -= dy;
z.z -= dz;
z *= 3.0;
DE *= 3.0;
z.y += dy;
z.z += dz;
z.x += SQRT_3_4;
r = length(z);
if ( r > Bailout)
return ( r - 2.) / DE;
}
}