コード例 #1
0
ファイル: marching_cubes.cpp プロジェクト: espinm2/audio
void MarchingCubes::drawTriangleWithNormals(const glm::vec3 &n1, const glm::vec3 &p1, 
					    const glm::vec3 &n2, const glm::vec3 &p2, 
					    const glm::vec3 &n3, const glm::vec3 &p3) {
  int num_marching_cubes_tris = marching_cubes_tri_indices.size();
  glm::vec3 color(0,0,1);
  marching_cubes_verts.push_back(VBOPosNormalColor(p1,n1,color));
  marching_cubes_verts.push_back(VBOPosNormalColor(p2,n2,color));
  marching_cubes_verts.push_back(VBOPosNormalColor(p3,n3,color));
  marching_cubes_tri_indices.push_back(VBOIndexedTri(num_marching_cubes_tris*3+0,
						     num_marching_cubes_tris*3+1,
						     num_marching_cubes_tris*3+2));
}
コード例 #2
0
ファイル: fluid_render.cpp プロジェクト: espinm2/adv_gfx_repo
void setupConeVBO(const Vec3f pts[5], const Vec3f &color, std::vector<VBOPosNormalColor> &faces) {

  Vec3f normal = computeNormal(pts[0],pts[1],pts[2]);
  faces.push_back(VBOPosNormalColor(pts[0],normal,Vec3f(1,1,1)));
  faces.push_back(VBOPosNormalColor(pts[1],normal,color));
  faces.push_back(VBOPosNormalColor(pts[2],normal,color));

  normal = computeNormal(pts[0],pts[2],pts[3]);
  faces.push_back(VBOPosNormalColor(pts[0],normal,Vec3f(1,1,1)));
  faces.push_back(VBOPosNormalColor(pts[2],normal,color));
  faces.push_back(VBOPosNormalColor(pts[3],normal,color));

  normal = computeNormal(pts[0],pts[3],pts[4]);
  faces.push_back(VBOPosNormalColor(pts[0],normal,Vec3f(1,1,1)));
  faces.push_back(VBOPosNormalColor(pts[3],normal,color));
  faces.push_back(VBOPosNormalColor(pts[4],normal,color));

  normal = computeNormal(pts[0],pts[4],pts[1]);
  faces.push_back(VBOPosNormalColor(pts[0],normal,Vec3f(1,1,1)));
  faces.push_back(VBOPosNormalColor(pts[4],normal,color));
  faces.push_back(VBOPosNormalColor(pts[1],normal,color));

  normal = computeNormal(pts[1],pts[3],pts[2]);
  faces.push_back(VBOPosNormalColor(pts[1],normal,color));
  faces.push_back(VBOPosNormalColor(pts[3],normal,color));
  faces.push_back(VBOPosNormalColor(pts[2],normal,color));
  faces.push_back(VBOPosNormalColor(pts[1],normal,color));
  faces.push_back(VBOPosNormalColor(pts[4],normal,color));
  faces.push_back(VBOPosNormalColor(pts[3],normal,color));
}
コード例 #3
0
ファイル: fluid_render.cpp プロジェクト: espinm2/adv_gfx_repo
void setupCubeVBO(const Vec3f pts[8], const Vec3f &color, std::vector<VBOPosNormalColor> &faces) {
  
  faces.push_back(VBOPosNormalColor(pts[0],Vec3f(-1,0,0),color));
  faces.push_back(VBOPosNormalColor(pts[1],Vec3f(-1,0,0),color));
  faces.push_back(VBOPosNormalColor(pts[3],Vec3f(-1,0,0),color));
  faces.push_back(VBOPosNormalColor(pts[2],Vec3f(-1,0,0),color));
  
  faces.push_back(VBOPosNormalColor(pts[4],Vec3f(1,0,0),color));
  faces.push_back(VBOPosNormalColor(pts[6],Vec3f(1,0,0),color));
  faces.push_back(VBOPosNormalColor(pts[7],Vec3f(1,0,0),color));
  faces.push_back(VBOPosNormalColor(pts[5],Vec3f(1,0,0),color));
  
  faces.push_back(VBOPosNormalColor(pts[0],Vec3f(0,0,-1),color));
  faces.push_back(VBOPosNormalColor(pts[2],Vec3f(0,0,-1),color));
  faces.push_back(VBOPosNormalColor(pts[6],Vec3f(0,0,-1),color));
  faces.push_back(VBOPosNormalColor(pts[4],Vec3f(0,0,-1),color));
  
  faces.push_back(VBOPosNormalColor(pts[1],Vec3f(0,0,1),color));
  faces.push_back(VBOPosNormalColor(pts[5],Vec3f(0,0,1),color));
  faces.push_back(VBOPosNormalColor(pts[7],Vec3f(0,0,1),color));
  faces.push_back(VBOPosNormalColor(pts[3],Vec3f(0,0,1),color));
  
  faces.push_back(VBOPosNormalColor(pts[0],Vec3f(0,-1,0),color));
  faces.push_back(VBOPosNormalColor(pts[4],Vec3f(0,-1,0),color));
  faces.push_back(VBOPosNormalColor(pts[5],Vec3f(0,-1,0),color));
  faces.push_back(VBOPosNormalColor(pts[1],Vec3f(0,-1,0),color));
	  
  faces.push_back(VBOPosNormalColor(pts[2],Vec3f(0,1,0),color));
  faces.push_back(VBOPosNormalColor(pts[3],Vec3f(0,1,0),color));
  faces.push_back(VBOPosNormalColor(pts[7],Vec3f(0,1,0),color));
  faces.push_back(VBOPosNormalColor(pts[6],Vec3f(0,1,0),color));
}
コード例 #4
0
ファイル: radiosity.cpp プロジェクト: jonwrona/ACG-Final
void Radiosity::setupVBOs() {
  HandleGLError("enter radiosity setupVBOs()");
  mesh_tri_verts.clear();
  mesh_tri_indices.clear();
  mesh_textured_tri_indices.clear();

  // initialize the data in each vector
  int num_faces = mesh->numFaces();
  assert (num_faces > 0);
  for (int i = 0; i < num_faces; i++) {
    Face *f = mesh->getFace(i);
    Edge *e = f->getEdge();
    glm::vec3 normal = f->computeNormal();

    double avg_s = 0;
    double avg_t = 0;
    glm::vec3 avg_color(0,0,0);

    int start = mesh_tri_verts.size();

    // wireframe is normally black, except when it's the special
    // patch, then the wireframe is red
    glm::vec4 wireframe_color(0,0,0,0.5);
    if (args->render_mode == RENDER_FORM_FACTORS && i == max_undistributed_patch) {
      wireframe_color = glm::vec4(1,0,0,1);
    }

    // add the 4 corner vertices
    for (int j = 0; j < 4; j++) {
      glm::vec3 pos = ((*f)[j])->get();
      double s = (*f)[j]->get_s();
      double t = (*f)[j]->get_t();
      glm::vec3 color = setupHelperForColor(f,i,j);
      color = glm::vec3(linear_to_srgb(color.r),
                        linear_to_srgb(color.g),
                        linear_to_srgb(color.b));
      avg_color += 0.25f * color;
      mesh_tri_verts.push_back(VBOPosNormalColor(pos,normal,
                                                 glm::vec4(color.r,color.g,color.b,1.0),
                                                 wireframe_color,
                                                 s,t));
      avg_s += 0.25 * s;
      avg_t += 0.25 * t;
      e = e->getNext();
    }

    // the centroid (for wireframe rendering)
    glm::vec3 centroid = f->computeCentroid();
    mesh_tri_verts.push_back(VBOPosNormalColor(centroid,normal,
                                               glm::vec4(avg_color.r,avg_color.g,avg_color.b,1),
                                               glm::vec4(1,1,1,1),
                                               avg_s,avg_t));

    if (f->getMaterial()->hasTextureMap()) {
      mesh_textured_tri_indices.push_back(VBOIndexedTri(start+0,start+1,start+4));
      mesh_textured_tri_indices.push_back(VBOIndexedTri(start+1,start+2,start+4));
      mesh_textured_tri_indices.push_back(VBOIndexedTri(start+2,start+3,start+4));
      mesh_textured_tri_indices.push_back(VBOIndexedTri(start+3,start+0,start+4));
    } else {
      mesh_tri_indices.push_back(VBOIndexedTri(start+0,start+1,start+4));
      mesh_tri_indices.push_back(VBOIndexedTri(start+1,start+2,start+4));
      mesh_tri_indices.push_back(VBOIndexedTri(start+2,start+3,start+4));
      mesh_tri_indices.push_back(VBOIndexedTri(start+3,start+0,start+4));
    }
  }
  assert ((int)mesh_tri_verts.size() == num_faces*5);
  assert ((int)mesh_tri_indices.size() + (int)mesh_textured_tri_indices.size() == num_faces*4);
  
  // copy the data to each VBO
  glBindBuffer(GL_ARRAY_BUFFER,mesh_tri_verts_VBO); 
  glBufferData(GL_ARRAY_BUFFER,
	       sizeof(VBOPosNormalColor) * num_faces * 5,
	       &mesh_tri_verts[0],
	       GL_STATIC_DRAW); 
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,mesh_tri_indices_VBO); 
  glBufferData(GL_ELEMENT_ARRAY_BUFFER,
	       sizeof(VBOIndexedTri) * mesh_tri_indices.size(),
	       &mesh_tri_indices[0], GL_STATIC_DRAW);
  if (mesh_textured_tri_indices.size() > 0) {
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,mesh_textured_tri_indices_VBO); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,
                 sizeof(VBOIndexedTri) * mesh_textured_tri_indices.size(),
                 &mesh_textured_tri_indices[0], GL_STATIC_DRAW);
    
  }

  HandleGLError("radiosity setupVBOs() just before texture");

  // WARNING: this naive VBO implementation only allows a single texture
  // FIXME: something still buggy about textures
  int num_textured_materials = 0;
  for (unsigned int mat = 0; mat < mesh->materials.size(); mat++) {
    Material *m = mesh->materials[mat];
    if (m->hasTextureMap()) {
      // FIXME: old gl...
      //glBindTexture(GL_TEXTURE_2D,m->getTextureID());
      num_textured_materials++;
    }
  }
  assert (num_textured_materials <= 1);

  HandleGLError("leave radiosity setupVBOs()");
}
コード例 #5
0
// Scan through the image from the lower left corner across each row
// and then up to the top right.  Initially the image is sampled very
// coarsely.  Increment the static variables that track the progress
// through the scans
int GLCanvas::DrawPixel() {
  if (raytracing_x >= raytracing_divs_x) {
    // end of row
    raytracing_x = 0; 
    raytracing_y += 1;
  }
  if (raytracing_y >= raytracing_divs_y) {
    // last row
    if (raytracing_divs_x >= args->width ||
        raytracing_divs_y >= args->height) {
      // stop rendering, matches resolution of current camera
      return 0; 
    }
    // else decrease pixel size & start over again in the bottom left corner
    raytracing_divs_x *= 6;
    raytracing_divs_y *= 6;
    if (raytracing_divs_x > args->width * 0.51 ||
        raytracing_divs_x > args->height * 0.51) {
      raytracing_divs_x = args->width;
      raytracing_divs_y = args->height;
    }
    raytracing_x = 0;
    raytracing_y = 0;
    if (raytracer->render_to_a) {
      raytracer->pixels_b.clear();
      raytracer->pixels_indices_b.clear();
     raytracer->render_to_a = false;
    } else {
      raytracer->pixels_a.clear();
      raytracer->pixels_indices_a.clear();
      raytracer->render_to_a = true;
    }
  }

  double x_spacing = args->width / double (raytracing_divs_x);
  double y_spacing = args->height / double (raytracing_divs_y);

  // compute the color and position of intersection
  glm::vec3 pos1 =  GetPos((raytracing_x  )*x_spacing, (raytracing_y  )*y_spacing);
  glm::vec3 pos2 =  GetPos((raytracing_x+1)*x_spacing, (raytracing_y  )*y_spacing);
  glm::vec3 pos3 =  GetPos((raytracing_x+1)*x_spacing, (raytracing_y+1)*y_spacing);
  glm::vec3 pos4 =  GetPos((raytracing_x  )*x_spacing, (raytracing_y+1)*y_spacing);
  
  glm::vec3 color = TraceRay((raytracing_x+0.5)*x_spacing, (raytracing_y+0.5)*y_spacing);

  double r = linear_to_srgb(color.r);
  double g = linear_to_srgb(color.g);
  double b = linear_to_srgb(color.b);
  if (raytracer->render_to_a) {
    int start = raytracer->pixels_a.size();
    raytracer->pixels_a.push_back(VBOPosNormalColor(pos1,glm::vec3(0,0,0),glm::vec4(r,g,b,1.0)));
    raytracer->pixels_a.push_back(VBOPosNormalColor(pos2,glm::vec3(0,0,0),glm::vec4(r,g,b,1.0)));
    raytracer->pixels_a.push_back(VBOPosNormalColor(pos3,glm::vec3(0,0,0),glm::vec4(r,g,b,1.0)));
    raytracer->pixels_a.push_back(VBOPosNormalColor(pos4,glm::vec3(0,0,0),glm::vec4(r,g,b,1.0)));
    raytracer->pixels_indices_a.push_back(VBOIndexedTri(start+0,start+1,start+2));
    raytracer->pixels_indices_a.push_back(VBOIndexedTri(start+0,start+2,start+3));
  } else {
    int start = raytracer->pixels_b.size();
    raytracer->pixels_b.push_back(VBOPosNormalColor(pos1,glm::vec3(0,0,0),glm::vec4(r,g,b,1.0)));
    raytracer->pixels_b.push_back(VBOPosNormalColor(pos2,glm::vec3(0,0,0),glm::vec4(r,g,b,1.0)));
    raytracer->pixels_b.push_back(VBOPosNormalColor(pos3,glm::vec3(0,0,0),glm::vec4(r,g,b,1.0)));
    raytracer->pixels_b.push_back(VBOPosNormalColor(pos4,glm::vec3(0,0,0),glm::vec4(r,g,b,1.0)));
    raytracer->pixels_indices_b.push_back(VBOIndexedTri(start+0,start+1,start+2));
    raytracer->pixels_indices_b.push_back(VBOIndexedTri(start+0,start+2,start+3));
  }  

  raytracing_x += 1;
  return 1;
}
コード例 #6
0
ファイル: utils.cpp プロジェクト: espinm2/audio
// since glLineWidth is gone...  
// instead we'll draw a rectangular box 
// (should probably use a geometry shader instead)
void addEdgeGeometry(std::vector<VBOPosNormalColor> &verts,
                     std::vector<VBOIndexedTri> &tri_indices,
                     const glm::vec3 &a, const glm::vec3 &b, 
                     const glm::vec3 &acolor, const glm::vec3 &bcolor, 
                     float a_th,float b_th) {
  
  // find perpendicular axes
  float length = glm::length(a-b);
  if (length < 0.01*std::min(a_th,b_th)) return;
  glm::vec3 dir = glm::normalize(b-a);
  glm::vec3 tmp = glm::cross(dir,glm::vec3(1,0,0));
  if (glm::length(tmp) < 0.1) {
    tmp = glm::cross(dir,glm::vec3(0,0,1));
  }
  tmp = glm::normalize(tmp);
  glm::vec3 one = glm::cross(dir,tmp);
  assert (fabs(glm::length(one)-1.0) < 0.001);
  glm::vec3 two = glm::cross(dir,one);
  assert (fabs(glm::length(two)-1.0) < 0.001);

  // draw the 6 faces of the box
  int start;
  start = verts.size();
  verts.push_back(VBOPosNormalColor(a-one*a_th+two*a_th,two,acolor));
  verts.push_back(VBOPosNormalColor(b-one*b_th+two*b_th,two,bcolor));
  verts.push_back(VBOPosNormalColor(b+one*b_th+two*b_th,two,bcolor));
  verts.push_back(VBOPosNormalColor(a+one*a_th+two*a_th,two,acolor));
  tri_indices.push_back(VBOIndexedTri(start,start+1,start+2));
  tri_indices.push_back(VBOIndexedTri(start,start+2,start+3));
  start += 4;
  verts.push_back(VBOPosNormalColor(a-one*a_th-two*a_th,-two,acolor));
  verts.push_back(VBOPosNormalColor(b-one*b_th-two*b_th,-two,bcolor));
  verts.push_back(VBOPosNormalColor(b+one*b_th-two*b_th,-two,bcolor));
  verts.push_back(VBOPosNormalColor(a+one*a_th-two*a_th,-two,acolor));
  tri_indices.push_back(VBOIndexedTri(start,start+2,start+1));
  tri_indices.push_back(VBOIndexedTri(start,start+3,start+2));
  start += 4;
  verts.push_back(VBOPosNormalColor(a-two*a_th+one*a_th,one,acolor));
  verts.push_back(VBOPosNormalColor(b-two*b_th+one*b_th,one,bcolor));
  verts.push_back(VBOPosNormalColor(b+two*b_th+one*b_th,one,bcolor));
  verts.push_back(VBOPosNormalColor(a+two*a_th+one*a_th,one,acolor));
  tri_indices.push_back(VBOIndexedTri(start,start+2,start+1));
  tri_indices.push_back(VBOIndexedTri(start,start+3,start+2));
  start += 4;
  verts.push_back(VBOPosNormalColor(a-two*a_th-one*a_th,-one,acolor));
  verts.push_back(VBOPosNormalColor(b-two*b_th-one*b_th,-one,bcolor));
  verts.push_back(VBOPosNormalColor(b+two*b_th-one*b_th,-one,bcolor));
  verts.push_back(VBOPosNormalColor(a+two*a_th-one*a_th,-one,acolor));
  tri_indices.push_back(VBOIndexedTri(start,start+1,start+2));
  tri_indices.push_back(VBOIndexedTri(start,start+2,start+3));
  start += 4;
  verts.push_back(VBOPosNormalColor(a-two*a_th-one*a_th,-dir,acolor));
  verts.push_back(VBOPosNormalColor(a-two*a_th+one*a_th,-dir,acolor));
  verts.push_back(VBOPosNormalColor(a+two*a_th+one*a_th,-dir,acolor));
  verts.push_back(VBOPosNormalColor(a+two*a_th-one*a_th,-dir,acolor));
  tri_indices.push_back(VBOIndexedTri(start,start+2,start+1));
  tri_indices.push_back(VBOIndexedTri(start,start+3,start+2));
  start += 4;
  verts.push_back(VBOPosNormalColor(b-two*b_th-one*b_th,dir,bcolor));
  verts.push_back(VBOPosNormalColor(b-two*b_th+one*b_th,dir,bcolor));
  verts.push_back(VBOPosNormalColor(b+two*b_th+one*b_th,dir,bcolor));
  verts.push_back(VBOPosNormalColor(b+two*b_th-one*b_th,dir,bcolor));
  tri_indices.push_back(VBOIndexedTri(start,start+1,start+2));
  tri_indices.push_back(VBOIndexedTri(start,start+2,start+3));
}