void PhotonMapping::setupVBOs() { HandleGLError("enter photonmapping setupvbos()"); photon_direction_verts.clear(); photon_direction_indices.clear(); kdtree_verts.clear(); kdtree_edge_indices.clear(); // initialize the data BoundingBox *bb = mesh->getBoundingBox(); float max_dim = bb->maxDim(); if (kdtree == NULL) return; std::vector<const KDTree*> todo; todo.push_back(kdtree); while (!todo.empty()) { const KDTree *node = todo.back(); todo.pop_back(); if (node->isLeaf()) { // initialize photon direction vbo const std::vector<Photon> &photons = node->getPhotons(); int num_photons = photons.size(); for (int i = 0; i < num_photons; i++) { const Photon &p = photons[i]; glm::vec3 energy = p.getEnergy()*float(args->num_photons_to_shoot); glm::vec4 color(energy.x,energy.y,energy.z,1); const glm::vec3 &position = p.getPosition(); glm::vec3 other = position - p.getDirectionFrom()*0.02f*max_dim; addEdgeGeometry(photon_direction_verts,photon_direction_indices, position,other,color,color,max_dim*0.0005f,0); } // initialize kdtree vbo float thickness = 0.001*max_dim; glm::vec3 A = node->getMin(); glm::vec3 B = node->getMax(); glm::vec4 black(1,0,0,1); addEdgeGeometry(kdtree_verts,kdtree_edge_indices,glm::vec3(A.x,A.y,A.z),glm::vec3(A.x,A.y,B.z),black,black,thickness,thickness); addEdgeGeometry(kdtree_verts,kdtree_edge_indices,glm::vec3(A.x,A.y,B.z),glm::vec3(A.x,B.y,B.z),black,black,thickness,thickness); addEdgeGeometry(kdtree_verts,kdtree_edge_indices,glm::vec3(A.x,B.y,B.z),glm::vec3(A.x,B.y,A.z),black,black,thickness,thickness); addEdgeGeometry(kdtree_verts,kdtree_edge_indices,glm::vec3(A.x,B.y,A.z),glm::vec3(A.x,A.y,A.z),black,black,thickness,thickness); addEdgeGeometry(kdtree_verts,kdtree_edge_indices,glm::vec3(B.x,A.y,A.z),glm::vec3(B.x,A.y,B.z),black,black,thickness,thickness); addEdgeGeometry(kdtree_verts,kdtree_edge_indices,glm::vec3(B.x,A.y,B.z),glm::vec3(B.x,B.y,B.z),black,black,thickness,thickness); addEdgeGeometry(kdtree_verts,kdtree_edge_indices,glm::vec3(B.x,B.y,B.z),glm::vec3(B.x,B.y,A.z),black,black,thickness,thickness); addEdgeGeometry(kdtree_verts,kdtree_edge_indices,glm::vec3(B.x,B.y,A.z),glm::vec3(B.x,A.y,A.z),black,black,thickness,thickness); addEdgeGeometry(kdtree_verts,kdtree_edge_indices,glm::vec3(A.x,A.y,A.z),glm::vec3(B.x,A.y,A.z),black,black,thickness,thickness); addEdgeGeometry(kdtree_verts,kdtree_edge_indices,glm::vec3(A.x,A.y,B.z),glm::vec3(B.x,A.y,B.z),black,black,thickness,thickness); addEdgeGeometry(kdtree_verts,kdtree_edge_indices,glm::vec3(A.x,B.y,B.z),glm::vec3(B.x,B.y,B.z),black,black,thickness,thickness); addEdgeGeometry(kdtree_verts,kdtree_edge_indices,glm::vec3(A.x,B.y,A.z),glm::vec3(B.x,B.y,A.z),black,black,thickness,thickness); } else { todo.push_back(node->getChild1()); todo.push_back(node->getChild2()); } } // copy the data to each VBO if (photon_direction_verts.size() > 0) { glBindBuffer(GL_ARRAY_BUFFER,photon_direction_verts_VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(VBOPosNormalColor) * photon_direction_verts.size(), &photon_direction_verts[0], GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,photon_direction_indices_VBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(VBOIndexedTri) * photon_direction_indices.size(), &photon_direction_indices[0], GL_STATIC_DRAW); } if (kdtree_verts.size() > 0) { glBindBuffer(GL_ARRAY_BUFFER,kdtree_verts_VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(VBOPosNormalColor) * kdtree_verts.size(), &kdtree_verts[0], GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,kdtree_edge_indices_VBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(VBOIndexedTri) * kdtree_edge_indices.size(), &kdtree_edge_indices[0], GL_STATIC_DRAW); } HandleGLError("leave photonmapping setupvbos()"); }
void BoundingBox::setupVBOs() { HandleGLError("bounding box setup VBOs enter"); float thickness = 0.001*glm::length(maximum-minimum); glm::vec3& A = minimum; glm::vec3& B = maximum; glm::vec4 black(0,0,0,1); addEdgeGeometry(bb_verts,bb_tri_indices,glm::vec3(A.x,A.y,A.z),glm::vec3(A.x,A.y,B.z),black,black,thickness,thickness); addEdgeGeometry(bb_verts,bb_tri_indices,glm::vec3(A.x,A.y,B.z),glm::vec3(A.x,B.y,B.z),black,black,thickness,thickness); addEdgeGeometry(bb_verts,bb_tri_indices,glm::vec3(A.x,B.y,B.z),glm::vec3(A.x,B.y,A.z),black,black,thickness,thickness); addEdgeGeometry(bb_verts,bb_tri_indices,glm::vec3(A.x,B.y,A.z),glm::vec3(A.x,A.y,A.z),black,black,thickness,thickness); addEdgeGeometry(bb_verts,bb_tri_indices,glm::vec3(B.x,A.y,A.z),glm::vec3(B.x,A.y,B.z),black,black,thickness,thickness); addEdgeGeometry(bb_verts,bb_tri_indices,glm::vec3(B.x,A.y,B.z),glm::vec3(B.x,B.y,B.z),black,black,thickness,thickness); addEdgeGeometry(bb_verts,bb_tri_indices,glm::vec3(B.x,B.y,B.z),glm::vec3(B.x,B.y,A.z),black,black,thickness,thickness); addEdgeGeometry(bb_verts,bb_tri_indices,glm::vec3(B.x,B.y,A.z),glm::vec3(B.x,A.y,A.z),black,black,thickness,thickness); addEdgeGeometry(bb_verts,bb_tri_indices,glm::vec3(A.x,A.y,A.z),glm::vec3(B.x,A.y,A.z),black,black,thickness,thickness); addEdgeGeometry(bb_verts,bb_tri_indices,glm::vec3(A.x,A.y,B.z),glm::vec3(B.x,A.y,B.z),black,black,thickness,thickness); addEdgeGeometry(bb_verts,bb_tri_indices,glm::vec3(A.x,B.y,B.z),glm::vec3(B.x,B.y,B.z),black,black,thickness,thickness); addEdgeGeometry(bb_verts,bb_tri_indices,glm::vec3(A.x,B.y,A.z),glm::vec3(B.x,B.y,A.z),black,black,thickness,thickness); glBindBuffer(GL_ARRAY_BUFFER,bb_verts_VBO); glBufferData(GL_ARRAY_BUFFER,sizeof(VBOPosNormalColor)*bb_verts.size(),&bb_verts[0],GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,bb_tri_indices_VBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(VBOIndexedTri)*bb_tri_indices.size(),&bb_tri_indices[0],GL_STATIC_DRAW); HandleGLError("bounding box setup VBOs finished"); }