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)); }
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)); }
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)); }
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()"); }
// 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; }
// 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)); }