Example #1
0
void RenderTarget::draw(Shader* shader, const glm::vec2& pos, const glm::vec2& size){
	glm::mat4 model(1.f);

	model = glm::translate(model, glm::vec3(pos.x, pos.y, 0.0f));
	model = glm::scale(model, glm::vec3(size.x, size.y, 1.0f));

	Shader::upload_model_matrix(model);

	shader->bind();
	texture_bind(Shader::TEXTURE_2D_0);
	depth_bind(Shader::TEXTURE_2D_1);
	glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[1]);

	glVertexAttribPointer(Shader::ATTR_POSITION,  3, GL_FLOAT, GL_FALSE, sizeof(Shader::vertex_t), (const GLvoid*)offsetof(Shader::vertex_t, pos));
	glVertexAttribPointer(Shader::ATTR_TEXCOORD,  2, GL_FLOAT, GL_FALSE, sizeof(Shader::vertex_t), (const GLvoid*)offsetof(Shader::vertex_t, uv));
	glVertexAttribPointer(Shader::ATTR_NORMAL,    3, GL_FLOAT, GL_FALSE, sizeof(Shader::vertex_t), (const GLvoid*)offsetof(Shader::vertex_t, normal));
	glVertexAttribPointer(Shader::ATTR_TANGENT,   3, GL_FLOAT, GL_FALSE, sizeof(Shader::vertex_t), (const GLvoid*)offsetof(Shader::vertex_t, tangent));
	glVertexAttribPointer(Shader::ATTR_BITANGENT, 3, GL_FLOAT, GL_FALSE, sizeof(Shader::vertex_t), (const GLvoid*)offsetof(Shader::vertex_t, bitangent));
	glVertexAttribPointer(Shader::ATTR_COLOR,     4, GL_FLOAT, GL_FALSE, sizeof(Shader::vertex_t), (const GLvoid*)offsetof(Shader::vertex_t, color));

	glDrawElements(GL_QUADS, 4, GL_UNSIGNED_INT, 0);
}
Example #2
0
void
derp (void)
{
  const struct aiScene *csc;
  struct aiScene *sc;
  struct aiMesh *me;
  GLuint vb, nb, tb;
  GLuint ctex;
  GLuint dtex;
  GLuint fbo;
  GLuint dpp;
  GLint dpp_cat0_loc;

  csc = aiImportFile ("../data/n1.dae",
                      aiProcess_Triangulate | aiProcess_PreTransformVertices);
  sc = (struct aiScene *)csc;
  
  g_xassert (sc);
  g_xassert (sc->mNumMeshes >= 1);
  g_xassert (sc->mNumMaterials >= 1);

  me = sc->mMeshes[0];

  g_xassert (aiPrimitiveType_TRIANGLE == me->mPrimitiveTypes);

  mesh_buffers_extract (me, &vb, &nb, &tb);

  /* Save Viewport, Modelview, Projection.
   * Then set them to sane defaults.
   *
   * Empirical test indicates projection set to Ortho,
   * Modelview set to Identity, Viewport set to 0,0,w,h.
   *
   * ModelView and Viewport are fine but Projection has to go,
   * as I plan setting it myself.
   */

  allegro_ffp_restore (RESTORE_MODE_SAVE, RESTORE_SUB_ALLEGRO);

  /*
   * Do not do this...
   * While it is useful to play it safe and save & restore viewport/mst,
   * I am not actually supposed to set over allegro's stuff, right?
   * Actually:
   *    Need to use allegro's original settings when using the
   *    drawing routines targeting framebuffer 0. (eg debug_draw_tex_quad)
   * It is correct to LoadIdentity the projection stack,
   * but fix said routines to use allegro state.
   */

  glMatrixMode (GL_PROJECTION);
  glLoadIdentity ();
  glMatrixMode (GL_MODELVIEW);

  /* Clear the default framebuffer (Optional) */

  glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0);
  glClearColor (0, 0, 1, 1);
  glClear (GL_COLOR_BUFFER_BIT);

  /* Create two textures, a color and a depth. */

  glGenTextures (1, &ctex);
  glActiveTexture (GL_TEXTURE0);
  glBindTexture (GL_TEXTURE_2D, ctex);
  glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8,
		640, 480, 0,
		GL_RGBA, GL_UNSIGNED_BYTE,
		NULL);

  glGenTextures (1, &dtex);
  glActiveTexture (GL_TEXTURE0);
  glBindTexture (GL_TEXTURE_2D, dtex);
  glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexImage2D (GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24_ARB,
		640, 480, 0,
		GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
		NULL);

  check_gl_error ();

  /* Create a FBO and attach the newly created textures */

  glGenFramebuffersEXT (1, &fbo);
  glBindFramebufferEXT (GL_FRAMEBUFFER, fbo);
  glFramebufferTexture2DEXT (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
			     GL_TEXTURE_2D, ctex, 0);
  glFramebufferTexture2DEXT (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
			     GL_TEXTURE_2D, dtex, 0);
  
  g_xassert (GL_FRAMEBUFFER_COMPLETE ==
	   glCheckFramebufferStatusEXT (GL_FRAMEBUFFER));

  check_gl_error ();

  /* Create the depth pass program. (Vertex shader only, do nothing) */

  dpp = depth_pass_program ();

  check_gl_error ();

  struct DepthData ds;
  ds.fbo = fbo;
  ds.ab = vb;
  ds.dpp = dpp;

  depth_bind (&ds);

  {
    glMatrixMode (GL_PROJECTION);
    glPushMatrix ();
    glLoadIdentity ();
    //glOrtho (-2.5, 2.5, -2.5, 2.5, -5, 5);
    gluPerspective (90.0f, 1.0f, 1.0f, 5.0f);

    glMatrixMode (GL_MODELVIEW);
    glPushMatrix ();
    glLoadIdentity ();
    glTranslatef (0.0f, 0.0f, -2.5f);

    glDrawBuffer (GL_COLOR_ATTACHMENT0);
    glClear (GL_DEPTH_BUFFER_BIT);

    glBindBuffer (GL_ARRAY_BUFFER, ds.ab);
    glVertexAttribPointer (ds._cat0_loc, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glUseProgram (ds.dpp);
    glDrawArrays (GL_TRIANGLES, 0, me->mNumFaces * 3);
    glUseProgram (0);

    glMatrixMode (GL_PROJECTION);
    glPopMatrix ();

    glMatrixMode (GL_MODELVIEW);
    glPopMatrix ();
  }

  depth_unbind (&ds);

  debug_draw_tex_quad (ctex, 100, 0, 100, 100);
  debug_draw_tex_quad (dtex, 100, 150, 100, 100);

  /**
   * Material stuff, move elsewhere or something.
   */
  struct aiMaterial *mat;
  struct aiColor4D col_diff;
  struct aiColor4D col_spec;

  g_xassert (sc->mNumMaterials >= 1);

  mat = sc->mMaterials[me->mMaterialIndex];

  g_xassert (AI_SUCCESS ==
             aiGetMaterialColor (mat, AI_MATKEY_COLOR_DIFFUSE, &col_diff));

  g_xassert (AI_SUCCESS ==
             aiGetMaterialColor (mat, AI_MATKEY_COLOR_SPECULAR, &col_spec));

  struct MaterialFbo mf = {0};
  mf.tdep = dtex;

  material_create_fbo (&mf);

  /**
   * Warning:
   * Remember to unbind the depth texture (dtex) from depth_stage fbo,
   * Rebind it as texture for rendering. (Don't need to unbind?)
   * (4.4.2) ""A single framebuffer-attachable image may be attached
   * to multiple framebuffer objects""
   * Not sure about whether unbind required.
   * (4.4.3) Warns about Feedback loops, which do apply.
   */
  struct MaterialData ms = {0};
  ms.fbo = mf._fbo;
  ms.ctex = blender_tex;
  ms.dtex = dtex;
  ms.mpp = material_pass_program ();
  ms.vb = vb;
  ms.nb = nb;
  ms.tb = tb;

  material_bind (&ms);

  {
    glMatrixMode (GL_PROJECTION);
    glPushMatrix ();
    glLoadIdentity ();
    //glOrtho (-2.5, 2.5, -2.5, 2.5, -5, 5);
    gluPerspective (90.0f, 1.0f, 1.0f, 5.0f);

    glMatrixMode (GL_MODELVIEW);
    glPushMatrix ();
    glLoadIdentity ();
    glTranslatef (0.0f, 0.0f, -2.5f);

    GLenum material_draw_buffers[] = {GL_COLOR_ATTACHMENT0,
                                      GL_COLOR_ATTACHMENT1,
                                      GL_COLOR_ATTACHMENT2};
    glDrawBuffers (3, material_draw_buffers);

    glBindBuffer (GL_ARRAY_BUFFER, ms.vb);
    glVertexAttribPointer (ms._cat0_loc, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glBindBuffer (GL_ARRAY_BUFFER, ms.nb);
    glVertexAttribPointer (ms._cat1_nor, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glBindBuffer (GL_ARRAY_BUFFER, ms.tb);
    glVertexAttribPointer (ms._cat2_tex, 3, GL_FLOAT, GL_FALSE, 0, 0);

    /* Program needs to be active to load Uniforms */
    glUseProgram (ms.mpp);

    /**
     * Texture unit 0,
     * make sure diffuse / color texture is glBindTexture'd
     * while glActiveTexture is zero.
     */
    glUniform1i (ms._tex0, 0);

    /* Also go load diffuse, specular out of the aiColor4Ds */
    glUniform4f (ms._diffuse,
                 col_diff.r, col_diff.g, col_diff.b, col_diff.a);
    glUniform4f (ms._specular,
                 col_spec.r, col_spec.g, col_spec.b, col_spec.a);
    
    glActiveTexture (GL_TEXTURE0);
    glEnable (GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, ms.ctex);

    glDrawArrays (GL_TRIANGLES, 0, me->mNumFaces * 3);

    glUseProgram (0);

    glMatrixMode (GL_PROJECTION);
    glPopMatrix ();

    glMatrixMode (GL_MODELVIEW);
    glPopMatrix ();
  }

  material_unbind (&ms);

  /**
   * I believe I don't have the right COLOR_ATTACHMENTs during material stage.
   * In any case ctex probably ends up as normals.
   * Creating a new FBO for the material stage is probably ok.
   *
   * Warning:
   * For unknown reason the model, automaticall unwrapped by Blender
   * (Select all faces -> U -> Unwrap) had its UV coordinates screwed up.
   * Re-exporting with a proper UV map somehow fixed the problem.
   *
   * Blender settings: (Texure Properties)
   * Image/Source: Single Image
   * Mapping/Coordinates: UV
   * Mapping Layer: (Empty)
   * Mapping/Projection: Flat
   */
  //debug_draw_tex_quad (ctex, 200, 0, 100, 100);
  debug_draw_tex_quad (mf._tnor, 200, 0, 100, 100);
  debug_draw_tex_quad (mf._tdiff, 200, 110, 100, 100);
  debug_draw_tex_quad (mf._tspec, 200, 220, 100, 100);

  /* 3.4 Lighting Stage */
  struct LightingFbo lf = {0};
  lf.tdep = dtex;

  lighting_create_fbo (&lf);

  struct LightingData ls = {0};
  ls.fbo = lf._fbo;
  ls.lpp = lighting_ambient_pass_program ();
  ls.dtex = dtex;
  ls.tnor = mf._tnor;
  ls.tdiff = mf._tdiff;
  ls.tspec = mf._tspec;

  lighting_bind (&ls);

  {
  }

  lighting_unbind (&ls);

  /* Restore the saved allegro settings */

  allegro_ffp_restore (RESTORE_MODE_RESTORE, RESTORE_SUB_ALLEGRO);
}