   );
 }
 
+float pModPolar(inout vec2 p, float repetitions) {
+	float angle = 2.*PI/repetitions;
+	float a = atan(p.y, p.x) + angle/2.;
+	float r = length(p);
+	float c = floor(a/angle);
+	a = mod(a,angle) - angle/2.;
+	p = vec2(cos(a), sin(a))*r;
+	// For an odd number of repetitions, fix cell index of the cell in -x direction
+	// (cell index would be e.g. -5 and 5 in the two halves of the cell):
+	if (abs(c) >= (repetitions/2.)) c = abs(c);
+	return c;
+}
+
 vec2 bloodCellField(vec3 p) {
+  //return vec2(sdBloodCell(p), 54.);
+
+  // failed attempts
   //float plasmaBlood = calcPlasma(p.x, p.y, p.z, a / 10.);
   //vec2(sdSphere(p-offs, .5 - 0.01 * sin(20.0* p.x + 15.0*p.y + a * 3.0)), 80.0)
+
+  p += vec3(.0, .0, e + a);
+
+  vec2 res = vec2(sdBloodCell(opRep(p, vec3(3.))), 54.);
+
+  pR(p.xy, 1.);
+  p += vec3(.0, .0, a * .1);
+  res = opU(res, vec2(sdBloodCell(opRep(p, vec3(3.))), 54.));
+
+  pR(p.yz, 1.);
+  p += vec3(.0, .0, a * .1);
+  res = opU(res, vec2(sdBloodCell(opRep(p, vec3(3.))), 54.));
+/*
+  // manual repeat, slow AF
+  for (int x = 0; x < 2; x++) {
+    for (int y = 0; y < 2; y++) {
+      vec3 thisPos = repeated + vec3(x, y, x + int(mod(float(y * 4), 5.)));
+      pR(thisPos.xy, float(x + y));
+
+      res = opU(
+        res,
+        vec2(sdBloodCell(thisPos), 54.)
+      );
+    }
+  }
+  */
+  // TODO start value??
+  /*
+  vec2 res = vec2(0.2, 54.);
+
+  // manual repeat, slow AF
+  for (int x = 0; x < 2; x++) {
+    for (int y = 0; y < 2; y++) {
+      vec3 thisPos = repeated + vec3(x, y, x + int(mod(float(y * 4), 5.)));
+      pR(thisPos.xy, float(x + y));
+
+      res = opU(
+        res,
+        vec2(sdBloodCell(thisPos), 54.)
+      );
+    }
+  }
+  */
+
+  return res;
+
+/*
+
+  pR(p.xy, p.x * 0.1);
 
   vec3 repeated =
     opRep(
       p + vec3(.0, .0, e + a),
-      vec3(1.5)
+      vec3(1.2)
     );
     // TODO: tweak parameters
 
+  //repeated = opTwist(repeated);
   //repeated.xy = pR(repeated.xy, a);
-
-  return vec2(sdBloodCell2(repeated), 54.);
+  //repeated =
+  //pR(p.xz, a);
+
+  return vec2(sdBloodCell(repeated), 54.);
+  */
 }
 
 /*

vec2 bloodVein(vec3 pos) {
  return vec2(
    // tunnel shape
    sdBloodVein(pos + vec3(3.,-1.,1.))

    // blobby surface
    + 0.05 * sin(3.0 * pos.z),

    // color
    54.0

    lin += .25*fre*vec3(1.)*occ;
    col = col*lin;

    // fog
    col = mix( col, vec3(.0), 1.-exp( -.001*t*t*t ) );

    /*
    float fade = 1. - min(1., (a - 2.)  / 8.);
    col = mix( col, vec3(.0), fade );
    */
  }

  return vec3( clamp(col,.0,1.) );
