#include "Renderer.hpp"
#include "fbodefs.h"
#include "wipemalloc.h"
#include "math.h"
#include "Common.hpp"
#include "KeyHandler.hpp"
#include "TextureManager.hpp"
#include <iostream>
#include <algorithm>
#include <cassert>
#include "omptl/omptl"
#include "omptl/omptl_algorithm"
#include "UserTexture.hpp"


class Preset;

Renderer::Renderer (
int         width,
int         height,
int         gx,
int         gy,
int         texsize,
BeatDetect  *beatDetect,
std::string _presetURL,
std::string _titlefontURL,
std::string _menufontURL
)
  : title_fontURL(_titlefontURL),
    menu_fontURL(_menufontURL),
    presetURL(_presetURL),
    m_presetName("None"),
    vw(width), vh(height),
    texsize(texsize),
    mesh(gx, gy)
{
  int x;
  int y;

  this->totalframes = 1;
  this->noSwitch = false;
  this->showfps = false;
  this->showtitle = false;
  this->showpreset = false;
  this->showhelp = false;
  this->showstats = false;
  this->studio = false;
  this->realfps = 0;

  this->drawtitle = 0;

  //this->title = "Unknown";

  /** Other stuff... */
  this->correction = true;
  this->aspect = (float) height / (float) width;;

  /// @bug put these on member init list
  this->renderTarget = new RenderTarget(texsize, width, height);
  this->textureManager = new TextureManager(presetURL);
  this->beatDetect = beatDetect;

#ifdef USE_FTGL
  /**f Load the standard fonts */

  title_font = new FTGLPixmapFont(title_fontURL.c_str());
  other_font = new FTGLPixmapFont(menu_fontURL.c_str());
  poly_font = new FTGLExtrdFont(title_fontURL.c_str());

  if(title_font->Error()) {
    fprintf(stderr, "Failed to open font %s\n", title_fontURL.c_str());
  } else {
    title_font->UseDisplayList(true);
  }

  other_font->UseDisplayList(true);

  if(poly_font->Error()) {
    fprintf(stderr, "Failed to open font %s\n", title_fontURL.c_str());
  } else {
    poly_font->UseDisplayList(true);
    poly_font->Depth(20);
    poly_font->FaceSize(72);
  }
#endif /** USE_FTGL */


  int size = (mesh.height - 1) *mesh.width * 5 * 2;
  p = ( float * ) wipemalloc ( size * sizeof ( float ) );


  for (int j = 0; j < mesh.height - 1; j++)
  {
    int base = j * mesh.width * 2 * 5;

    for (int i = 0; i < mesh.width; i++)
    {
      int index = j * mesh.width + i;
      int index2 = (j + 1) * mesh.width + i;

      int strip = base + i * 10;
      p[strip + 2] = mesh.identity[index].x;
      p[strip + 3] = mesh.identity[index].y;
      p[strip + 4] = 0;

      p[strip + 7] = mesh.identity[index2].x;
      p[strip + 8] = mesh.identity[index2].y;
      p[strip + 9] = 0;
    }
  }


#ifdef USE_CG
  shaderEngine.setParams(renderTarget->texsize, renderTarget->textureID[1], aspect, beatDetect, textureManager);
#endif

}

void
Renderer::SetPipeline(Pipeline &pipeline)
{
  currentPipe = &pipeline;
#ifdef USE_CG
  shaderEngine.reset();
  shaderEngine.loadShader(pipeline.warpShader);
  shaderEngine.loadShader(pipeline.compositeShader);
#endif
}

void
Renderer::ResetTextures()
{
  textureManager->Clear();

  delete (renderTarget);
  renderTarget = new RenderTarget(texsize, vw, vh);
  reset(vw, vh);

  textureManager->Preload();
}

void
Renderer::SetupPass1(const Pipeline &pipeline, const PipelineContext &pipelineContext)
{
  //glMatrixMode(GL_PROJECTION);
  //glPushMatrix();
  //glMatrixMode(GL_MODELVIEW);
  //glPushMatrix();

  totalframes++;
  renderTarget->lock();
  glViewport(0, 0, renderTarget->texsize, renderTarget->texsize);

  glEnable(GL_TEXTURE_2D);

  //If using FBO, switch to FBO texture

  glMatrixMode(GL_TEXTURE);
  glLoadIdentity();

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

#ifdef USE_GLES1
  glOrthof(0.0, 1, 0.0, 1, -40, 40);
#else
  glOrtho(0.0, 1, 0.0, 1, -40, 40);
#endif

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

#ifdef USE_CG
  shaderEngine.RenderBlurTextures(pipeline, pipelineContext, renderTarget->texsize);
#endif
}

void
Renderer::RenderItems(const Pipeline &pipeline, const PipelineContext &pipelineContext)
{
  renderContext.time = pipelineContext.time;
  renderContext.texsize = texsize;
  renderContext.aspectCorrect = correction;
  renderContext.aspectRatio = aspect;
  renderContext.textureManager = textureManager;
  renderContext.beatDetect = beatDetect;

  for (std::vector<RenderItem*>::const_iterator pos = pipeline.drawables.begin();
       pos != pipeline.drawables.end();
       ++pos)
  {
    if (*pos != NULL)
    {
      (*pos)->Draw(renderContext);
    }
  }
}

void
Renderer::FinishPass1()
{
  draw_title_to_texture();
  /** Restore original view state */
  //glMatrixMode(GL_MODELVIEW);
  //glPopMatrix();

  //glMatrixMode(GL_PROJECTION);
  //glPopMatrix();

  renderTarget->unlock();
}

void
Renderer::Pass2(const Pipeline &pipeline, const PipelineContext &pipelineContext)
{
  //BEGIN PASS 2
  //
  //end of texture rendering
  //now we copy the texture from the FBO or framebuffer to
  //video texture memory and render fullscreen.

  /** Reset the viewport size */

#ifdef USE_FBO
  if (renderTarget->renderToTexture)
  {
    glBindFramebuffer(GL_FRAMEBUFFER, this->renderTarget->fbuffer[1]);
    glViewport(0, 0, this->renderTarget->texsize, this->renderTarget->texsize);
  }
  else
#endif
    glViewport(0, 0, this->vw, this->vh);

  glBindTexture(GL_TEXTURE_2D, this->renderTarget->textureID[0]);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
#ifdef USE_GLES1
  glOrthof(-0.5, 0.5, -0.5, 0.5, -40, 40);
#else
  glOrtho(-0.5, 0.5, -0.5, 0.5, -40, 40);
#endif
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

  glLineWidth(this->renderTarget->texsize < 512 ? 1 : this->renderTarget->texsize / 512.0);

  CompositeOutput(pipeline, pipelineContext);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glTranslatef(-0.5, -0.5, 0);

  // When console refreshes, there is a chance the preset has been changed by the user
  refreshConsole();
  draw_title_to_screen(false);
  if (this->showhelp % 2)
    draw_help();
  if (this->showtitle % 2)
    draw_title();
  if (this->showfps % 2)
    draw_fps(this->realfps);
  if (this->showpreset % 2)
    draw_preset();
  if (this->showstats % 2)
    draw_stats();
  glTranslatef(0.5, 0.5, 0);

#ifdef USE_FBO
  if (renderTarget->renderToTexture)
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
#endif
}

void
Renderer::RenderFrame(const Pipeline &pipeline, const PipelineContext &pipelineContext)
{

  SetupPass1(pipeline, pipelineContext);

#ifdef USE_CG
  shaderEngine.enableShader(currentPipe->warpShader, pipeline, pipelineContext);
#endif
  Interpolation(pipeline);
#ifdef USE_CG
  shaderEngine.disableShader();
#endif

  RenderItems(pipeline, pipelineContext);
  FinishPass1();
  Pass2(pipeline, pipelineContext);
}

void
Renderer::Interpolation(const Pipeline &pipeline)
{
  if (this->renderTarget->useFBO)
    glBindTexture(GL_TEXTURE_2D, renderTarget->textureID[1]);
  else
    glBindTexture(GL_TEXTURE_2D, renderTarget->textureID[0]);

  //Texture wrapping( clamp vs. wrap)
  if (pipeline.textureWrap == 0)
  {
#ifdef USE_GLES1
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
#else
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
#endif
  }
  else
  {
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  }

  glMatrixMode(GL_TEXTURE);
  glLoadIdentity();

  glBlendFunc(GL_SRC_ALPHA, GL_ZERO);

  glColor4f(1.0, 1.0, 1.0, pipeline.screenDecay);

  glEnable(GL_TEXTURE_2D);


  glEnableClientState(GL_VERTEX_ARRAY);
  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  glDisableClientState(GL_COLOR_ARRAY);


  //glVertexPointer(2, GL_FLOAT, 0, p);
  //glTexCoordPointer(2, GL_FLOAT, 0, t);
  glTexCoordPointer (2, GL_FLOAT, sizeof (GLfloat) * 5, (GLfloat *) p);
  glVertexPointer (3, GL_FLOAT, sizeof (GLfloat) * 5, (GLfloat *) p + 2);


  if (pipeline.staticPerPixel)
  {
    for (int j = 0; j < mesh.height - 1; j++)
    {
      int base = j * mesh.width * 2 * 5;

      for (int i = 0; i < mesh.width; i++)
      {
        int strip = base + i * 10;
        p[strip] = pipeline.x_mesh[i][j];
        p[strip + 1] = pipeline.y_mesh[i][j];

        p[strip + 5] = pipeline.x_mesh[i][j+1];
        p[strip + 6] = pipeline.y_mesh[i][j+1];
      }
    }
  }
  else
  {
    mesh.Reset();
    omptl::transform(mesh.p.begin(), mesh.p.end(), mesh.identity.begin(), mesh.p.begin(), &Renderer::PerPixel);

    for (int j = 0; j < mesh.height - 1; j++)
    {
      int base = j * mesh.width * 2 * 5;

      for (int i = 0; i < mesh.width; i++)
      {
        int strip = base + i * 10;
        int index = j * mesh.width + i;
        int index2 = (j + 1) * mesh.width + i;

        p[strip] = mesh.p[index].x;
        p[strip + 1] = mesh.p[index].y;

        p[strip + 5] = mesh.p[index2].x;
        p[strip + 6] = mesh.p[index2].y;


      }
    }
  }

  for (int j = 0; j < mesh.height - 1; j++)
    glDrawArrays(GL_TRIANGLE_STRIP,j* mesh.width* 2,mesh.width*2);


  glDisable(GL_TEXTURE_2D);

  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

}

Pipeline* Renderer::currentPipe;

Renderer::~Renderer()
{

  int x;

  if (renderTarget)
    delete (renderTarget);
  if (textureManager)
    delete (textureManager);

  //std::cerr << "grid assign end" << std::endl;

  free(p);

#ifdef USE_FTGL
  //  std::cerr << "freeing title fonts" << std::endl;
  if (title_font)
    delete title_font;
  if (poly_font)
    delete poly_font;
  if (other_font)
    delete other_font;
  //  std::cerr << "freeing title fonts finished" << std::endl;
#endif
  //  std::cerr << "exiting destructor" << std::endl;
}

void
Renderer::reset(int w, int h)
{
  aspect = (float) h / (float) w;
  this -> vw = w;
  this -> vh = h;

#if USE_CG
  shaderEngine.setAspect(aspect);
#endif

  glShadeModel(GL_SMOOTH);

  glCullFace(GL_BACK);
  //glFrontFace( GL_CCW );

  glClearColor(0, 0, 0, 0);

  glViewport(0, 0, w, h);

  glMatrixMode(GL_TEXTURE);
  glLoadIdentity();

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

#ifndef USE_GLES1
  glDrawBuffer(GL_BACK);
  glReadBuffer(GL_BACK);
#endif
  glEnable(GL_BLEND);

  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

  glEnable(GL_LINE_SMOOTH);

  glEnable(GL_POINT_SMOOTH);
  glClear(GL_COLOR_BUFFER_BIT);

#ifndef USE_GLES1
  glLineStipple(2, 0xAAAA);
#endif

  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

  //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
  //glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
  //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

  if (!this->renderTarget->useFBO)
  {
    this->renderTarget->fallbackRescale(w, h);
  }
}

GLuint
Renderer::initRenderToTexture()
{
  return renderTarget->initRenderToTexture();
}

void
Renderer::draw_title_to_texture()
{
#ifdef USE_FTGL
  if (this->drawtitle > 100)
  {
    draw_title_to_screen(true);
    this->drawtitle = 0;
  }
#endif /** USE_FTGL */
}

float title_y;

void
Renderer::draw_title_to_screen(bool flip)
{

#ifdef USE_FTGL
  if (this->drawtitle > 0)
  {

    //setUpLighting();

    //glEnable(GL_POLYGON_SMOOTH);
    //glEnable( GL_CULL_FACE);
    glEnable(GL_DEPTH_TEST);
    glClear(GL_DEPTH_BUFFER_BIT);

    int draw;
    if (drawtitle >= 80)
      draw = 80;
    else
      draw = drawtitle;

    float easein = ((80 - draw) * .0125);
    float easein2 = easein * easein;

    if (drawtitle == 1)
    {
      title_y = (float) rand() / RAND_MAX;
      title_y *= 2;
      title_y -= 1;
      title_y *= .6;
    }
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    //glBlendFunc(GL_SRC_ALPHA_SATURATE,GL_ONE);
    glColor4f(1.0, 1.0, 1.0, 1.0);

    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();

    glFrustum(-1, 1, -1 * (float) vh / (float) vw, 1 * (float) vh / (float) vw, 1, 1000);
    if (flip)
      glScalef(1, -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();

    glTranslatef(-850, title_y * 850 * vh / vw, easein2 * 900 - 900);

    glRotatef(easein2 * 360, 1, 0, 0);

    poly_font->Render(this->title.c_str());

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    this->drawtitle++;

    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();

    glMatrixMode(GL_MODELVIEW);

    glDisable(GL_CULL_FACE);
    glDisable(GL_DEPTH_TEST);

    glDisable(GL_COLOR_MATERIAL);

    glDisable(GL_LIGHTING);
    glDisable(GL_POLYGON_SMOOTH);
  }
#endif /** USE_FTGL */
}

void
Renderer::draw_title()
{
#ifdef USE_FTGL
  //glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO);

  glColor4f(1.0, 1.0, 1.0, 1.0);
  //  glPushMatrix();
  //  glTranslatef(this->vw*.001,this->vh*.03, -1);
  //  glScalef(this->vw*.015,this->vh*.025,0);

  glRasterPos2f(0.01, 0.05);
  title_font->FaceSize((unsigned) (20 * (this->vh / 512.0)));

  title_font->Render(this->title.c_str());
  //  glPopMatrix();
  //glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

#endif /** USE_FTGL */
}

void
Renderer::draw_preset()
{
#ifdef USE_FTGL
  //glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO);

  glColor4f(1.0, 1.0, 1.0, 1.0);
  //      glPushMatrix();
  //glTranslatef(this->vw*.001,this->vh*-.01, -1);
  //glScalef(this->vw*.003,this->vh*.004,0);


  glRasterPos2f(0.01, 0.01);

  title_font->FaceSize((unsigned) (12 * (this->vh / 512.0)));
  if (this->noSwitch)
    title_font->Render("[LOCKED]  ");
  title_font->FaceSize((unsigned) (20 * (this->vh / 512.0)));

  title_font->Render(this->presetName().c_str());

  //glPopMatrix();
  // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
#endif /** USE_FTGL */
}

void
Renderer::draw_help()
{
#ifdef USE_FTGL
  //glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO);

  glColor4f(1.0, 1.0, 1.0, 1.0);
  glPushMatrix();
  glTranslatef(0, 1, 0);
  //glScalef(this->vw*.02,this->vh*.02 ,0);


  title_font->FaceSize((unsigned) (18 * (this->vh / 512.0)));

  glRasterPos2f(0.01, -0.05);
  title_font->Render("Help");

  glRasterPos2f(0.01, -0.09);
  title_font->Render("----------------------------");

  glRasterPos2f(0.01, -0.13);
  title_font->Render("F1: This help menu");

  glRasterPos2f(0.01, -0.17);
  title_font->Render("F2: Show song title");

  glRasterPos2f(0.01, -0.21);
  title_font->Render("F3: Show preset name");

  glRasterPos2f(0.01, -0.25);
  title_font->Render("F4: Show Rendering Settings");

  glRasterPos2f(0.01, -0.29);
  title_font->Render("F5: Show FPS");

  glRasterPos2f(0.01, -0.35);
  title_font->Render("F: Fullscreen");

  glRasterPos2f(0.01, -0.39);
  title_font->Render("L: Lock/Unlock Preset");

  glRasterPos2f(0.01, -0.43);
  title_font->Render("M: Show Menu");

  glRasterPos2f(0.01, -0.49);
  title_font->Render("R: Random preset");
  glRasterPos2f(0.01, -0.53);
  title_font->Render("N: Next preset");

  glRasterPos2f(0.01, -0.57);
  title_font->Render("P: Previous preset");

  glPopMatrix();
  //         glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

#endif /** USE_FTGL */
}

void
Renderer::draw_stats()
{
#ifdef USE_FTGL
  char buffer[128];
  float offset = (this->showfps % 2 ? -0.05 : 0.0);
  // glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO);

  glColor4f(1.0, 1.0, 1.0, 1.0);
  glPushMatrix();
  glTranslatef(0.01, 1, 0);
  glRasterPos2f(0, -.05 + offset);
  other_font->Render(this->correction ? "  aspect: corrected" : "  aspect: stretched");
  sprintf(buffer, " (%f)", this->aspect);
  other_font->Render(buffer);

  glRasterPos2f(0, -.09 + offset);
  other_font->FaceSize((unsigned) (18 * (vh / 512.0)));

  sprintf(buffer, "       texsize: %d", renderTarget->texsize);
  other_font->Render(buffer);

  glRasterPos2f(0, -.13 + offset);
  sprintf(buffer, "      viewport: %d x %d", vw, vh);

  other_font->Render(buffer);
  glRasterPos2f(0, -.17 + offset);
  other_font->Render((renderTarget->useFBO ? "           FBO: on" : "           FBO: off"));

  glRasterPos2f(0, -.21 + offset);
  sprintf(buffer, "          mesh: %d x %d", mesh.width, mesh.height);
  other_font->Render(buffer);

  glRasterPos2f(0, -.25 + offset);
  sprintf(buffer, "      textures: %.1fkB", textureManager->getTextureMemorySize() / 1000.0f);
  other_font->Render(buffer);
#ifdef USE_CG
  glRasterPos2f(0, -.29 + offset);
  sprintf(buffer, "shader profile: %s", shaderEngine.profileName.c_str());
  other_font->Render(buffer);

  glRasterPos2f(0, -.33 + offset);
  sprintf(buffer, "   warp shader: %s", currentPipe->warpShader.enabled ? "on" : "off");
  other_font->Render(buffer);

  glRasterPos2f(0, -.37 + offset);
  sprintf(buffer, "   comp shader: %s", currentPipe->compositeShader.enabled ? "on" : "off");
  other_font->Render(buffer);
#endif
  glPopMatrix();
  // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

#endif /** USE_FTGL */
}

void
Renderer::draw_fps(float realfps)
{
#ifdef USE_FTGL
  char bufferfps[20];
  sprintf(bufferfps, "%.1f fps", realfps);
  // glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO);

  glColor4f(1.0, 1.0, 1.0, 1.0);
  glPushMatrix();
  glTranslatef(0.01, 1, 0);
  glRasterPos2f(0, -0.05);
  title_font->FaceSize((unsigned) (20 * (this->vh / 512.0)));
  title_font->Render(bufferfps);

  glPopMatrix();
  // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

#endif /** USE_FTGL */
}

void
Renderer::CompositeOutput(const Pipeline &pipeline, const PipelineContext &pipelineContext)
{
  glMatrixMode(GL_TEXTURE);
  glLoadIdentity();

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

  //Overwrite anything on the screen
  glBlendFunc(GL_ONE, GL_ZERO);
  glColor4f(1.0, 1.0, 1.0, 1.0f);

  glEnable(GL_TEXTURE_2D);

#ifdef USE_CG
  shaderEngine.enableShader(currentPipe->compositeShader, pipeline, pipelineContext);
#endif

  float tex[4][2] =
    {
    { 0, 1 },
    { 0, 0 },
    { 1, 0 },
    { 1, 1 } };

  float points[4][2] =
    {
    { -0.5, -0.5 },
    { -0.5, 0.5 },
    { 0.5, 0.5 },
    { 0.5, -0.5 } };

  glEnableClientState(GL_VERTEX_ARRAY);
  glDisableClientState(GL_COLOR_ARRAY);
  glEnableClientState(GL_TEXTURE_COORD_ARRAY);

  glVertexPointer(2, GL_FLOAT, 0, points);
  glTexCoordPointer(2, GL_FLOAT, 0, tex);

  glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

  glDisable(GL_TEXTURE_2D);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

  glDisableClientState(GL_TEXTURE_COORD_ARRAY);

#ifdef USE_CG
  shaderEngine.disableShader();
#endif

  for (std::vector<RenderItem*>::const_iterator pos = pipeline.compositeDrawables.begin();
       pos != pipeline.compositeDrawables.end();
       ++pos)
    (*pos)->Draw(renderContext);
}
