       pow(p.y + .5 * cos(a / 3.), 2.)
     ) + 1.) + a)
   ) / 2.;
-  //plasma += 1.;
-  // vec2 res = vec2(.0);
-  //
-  // float transitionTime = 10.;
-  // float end0 = 20.;
-  // float end1 = 34.;
-  // float end2 = 50.;
-  // float end3 = 70.;
 
   return opU(
     // plasma sphere

    // plane
    vec2(p.y + 1., 0.)
  );

  /* ---------- DEBUGGING ---------- */
  // Uncomment when debugging single scene
  //return scene0(pos);

  /* ---------- SCENES --------- */

  // first scene
  // if (a < end0 + transitionTime) {
  //   res = scene0(pos);
  // }

  // start rendering after previous scene,
  // stop rendering after transitioning to next scene
  /*
  if (a >= end0 && a < end1 + transitionTime) {
    res = opMorph(res,
      scene1(pos + vec3(a, .0, sin(a))),

      // Timing
      end0,
      transitionTime
    );
  }
  */

  // last scene
  // if (a >= end0) {
  //   res = opMorph(res,
  //     scene1(pos),
  //
  //     // Timing
  //     end1,
  //     transitionTime
  //   );
  // }
  //
  // return res;
}

// vec2 castRay(vec3 ro, vec3 rd) {
// }


// float softshadow(vec3 ro, vec3 rd, float mint, float tmax) {
//   float res = 2.;
//   float t = mint;
//
//   for( float i=0.; i<16.; i++ ) {
//     float h = map( ro + rd*t ).x;
//     res = min( res, 8.*h/t );
//     t += clamp( h, .02, .10 );
//     if( h<.001 || t>tmax ) break;
//   }
//
//   return clamp( res, .0, 1. );
// }

// vec3 calcNormal(vec3 pos) {
//   vec2 e = vec2(.001,-.001); // (1, -1) * .5773*.0005
//   return normalize( e.xyy*map( pos + e.xyy ).x +
//     e.yyx*map( pos + e.yyx ).x +
//     e.yxy*map( pos + e.yxy ).x +
//     e.xxx*map( pos + e.xxx ).x );
// }

// float calcAO(vec3 pos, vec3 nor) {
//   float occ = .0;
//   float sca = 1.;
//
//   for(float i=0.; i<5.; i++) {
//     float hr = .01 + .12*float(i)/4.;
//     vec3 aopos =  nor * hr + pos;
//     float dd = map( aopos ).x;
//     occ += -(dd-hr)*sca;
//     sca *= .95;
//   }
//
//   return clamp( 1. - 3.*occ, .0, 1. );
// }

// vec3 render(vec3 ro, vec3 rd) {
  //vec3 col = vec3(.05, .05, .05) +rd.y*.1;
  // vec2 res = castRay(ro,rd);
  // vec3 nor = calcNormal(ro + res.x*rd);
  // vec3 ref = reflect( rd, nor );

  // material
  /*
  if( m<1.5 ) {
    float f = mod( floor(5.0*pos.z) + floor(5.0*pos.x), 2.0);
    col = .3 + .1*f*vec3(1.0);
  }
  */

  // lighitng. Seems Lighit
  //float occ = calcAO( pos, nor );
  //float amb = clamp( .5+.5*nor.y, .0, 1. );
  //float bac = clamp( dot( nor, normalize(vec3(-lig.x,.0,-lig.z))), .0, 1. )*clamp( 1.-pos.y,.0,1.);
  //float fre = pow( clamp(1.+dot(nor,rd),.0,1.), 2. );
  //float spe = pow(clamp( dot( ref, lig ), .0, 1. ),16.);

  //dif *= softshadow( pos, lig, .02, 2.5 );
  //dom *= softshadow( pos, ref, .02, 2.5 );

  //lin += 2.*spe*vec3(1.,.9,.7)*dif;
  //lin += .4*amb*vec3(.4,.6,1.);
  //lin += .5*bac*vec3(.25,.25,.25);
  //lin += .25*fre*vec3(1.);
  // return .1 + .5*sin( vec3(.05,.08,.1)*res.y ) * dot( nor, normalize( vec3(1.) ))*vec3(1.)+vec3(ref.y);

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

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

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

void main() {
  vec3 tot = vec3(.0);

// time variable (seconds)
uniform float a;

vec2 opU(vec2 d1, vec2 d2) {
  return d1.x<d2.x ? d1 : d2;
}

vec2 map(vec3 p) {
  float plasma = sin(5. *
