Mesh::Mesh(VertexList const& vertices) : m_id(afth::UUID::v4()) { size_t size = vertices.size() * 3; float* arr = new float[size]; VertexList::const_iterator it = vertices.begin(), end = vertices.end(); for (size_t i = 0; it != end; ++it, i += 3) { std::memcpy(arr + i, (*it).coordinates().arr().data(), 3 * sizeof(float)); } //glGenVertexArrays(1, &m_vertexArray); //glGenBuffers(1, &m_vertexBuffer); //glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); //glBufferData(GL_ARRAY_BUFFER, size * sizeof(float), arr, GL_STATIC_DRAW); //glBindVertexArray(m_vertexArray); //GLint positionIndex = glGetAttribLocation(glProgramUniform1, "position"); //glEnableVertexAttribArray(0); //glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); //glBindBuffer(GL_ARRAY_BUFFER, 0); //glBindVertexArray(0); delete [] arr; }
void IncrementalDelaunayTriangulator::insertSites(const VertexList& vertices) { for (VertexList::const_iterator x=vertices.begin(); x != vertices.end(); ++x) { insertSite(*x); } }
void Reprojector::projectCloud( IplImage *image ) { cvZero( image ); if( !this->projVertices.size() ) return; VertexList tempList; tempList.resize( this->projVertices.size() ); transform3DTo2D( this->projVertices.size(), &( this->projVertices[0] ), &( tempList[0] ), this->cxProjector, this->cyProjector, this->focalLengthProjector, false ); unsigned short val = 0; unsigned short *tempPtr = NULL; for( VertexList::const_iterator it = tempList.begin(); it != tempList.end(); ++it ) { unsigned int x = it->X; unsigned int y = it->Y; unsigned short depth = -( it->Z ); if( x >= image->width || y >= image->height ) continue; val = depth; tempPtr = (unsigned short*)( image->imageData ) + x + y * image->width; if( !( *tempPtr ) || *tempPtr > val ) //z-test *tempPtr = val; } }
void print_out (VertexList V) { // print out for (VertexList::iterator i = V.begin(); i != V.end(); ++i) { cout << i->first << " spe:" << i->second.spe << " pi:" << i->second.pi << endl; } }
void VertexListToBufP(std::vector<float> &dst,const VertexList &list){ dst.clear(); dst.reserve(list.size()*3); for(VertexList::const_iterator i = list.begin();i!=list.end();i++){ dst.push_back((*i).pos.x); dst.push_back((*i).pos.y); dst.push_back((*i).pos.z); } }
// copyVertexListToPointList a vector for Vec3 into a vector of Point's. void copyVertexListToPointList(const VertexList& in,PointList& out) { out.reserve(in.size()); for(VertexList::const_iterator itr=in.begin(); itr!=in.end(); ++itr) { out.push_back(Point(0,*itr)); } }
void smallestEnclosingSphere(SrPoint3D* sp,int nsp,VertexList& vertexList,const VertexIterator& end,SrSphere3D& sphere) { createSphere(sp, nsp,sphere); if( nsp==4 ) return; VertexIterator iterator = vertexList.begin(); for( ; end != iterator ; ) { const SrPoint3D& p = *iterator; if( isOut(p,sphere) ) { sp[ nsp ] = p; smallestEnclosingSphere( sp, nsp + 1 , vertexList , iterator , sphere); vertexList.splice(vertexList.begin(),vertexList,iterator++ ); } else { iterator++; } } }
void ProgressiveTriangleGeometry::FindEdgeToCollapse(VertexList& /*org_vertex_list*/, TriangleList& /*org_triangle_list*/, VertexList& vertex_list, TriangleList& triangle_list, Edge& edge) { if (triangle_list.empty()) return; float current_error = 0.0f; float current_max_error = 0.0f; edge.v1_ = 0; edge.v2_ = 0; edge.triangle_list_.clear(); // Calculate mean error. VertexList::iterator v_iter; for (v_iter = vertex_list.begin(); v_iter != vertex_list.end(); ++v_iter) { if (v_iter == vertex_list.begin()) { current_max_error = (*v_iter)->error_; } else if((*v_iter)->error_ > current_max_error) { current_max_error = (*v_iter)->error_; } current_error += (*v_iter)->error_; } current_error /= (float)vertex_list.size(); float min_error = 0.0f; float min_error1 = 0.0f; // Temporary error value storage for _edge->v1_. float min_error2 = 0.0f; // Temporary error value storage for _edge->v2_. bool first = true; // Test vertex collaps on all triangles. TriangleList::iterator tri_iter; for (tri_iter = triangle_list.begin(); tri_iter != triangle_list.end(); ++tri_iter) { Triangle* triangle = *tri_iter; vec3 diff1; vec3 diff2; Vertex mid; // Test V1 and V2. mid.x() = (triangle->v1_->x() + triangle->v2_->x()) * 0.5f; mid.y() = (triangle->v1_->y() + triangle->v2_->y()) * 0.5f; mid.z() = (triangle->v1_->z() + triangle->v2_->z()) * 0.5f; // Calculate the distance between the new, merged position, // and the original vertex position. diff1.Set(mid.x() - triangle->v1_->twin_->x(), mid.y() - triangle->v1_->twin_->y(), mid.z() - triangle->v1_->twin_->z()); diff2.Set(mid.x() - triangle->v2_->twin_->x(), mid.y() - triangle->v2_->twin_->y(), mid.z() - triangle->v2_->twin_->z()); float error1 = diff1.GetLength() + triangle->v1_->error_; float error2 = diff2.GetLength() + triangle->v2_->error_; float error = (error1 + error2 + current_error) / 3.0f; if (first == true || error < min_error) { edge.v1_ = triangle->v1_; edge.v2_ = triangle->v2_; min_error1 = error1; min_error2 = error2; min_error = error; first = false; } // Test V2 and V3. mid.x() = (triangle->v2_->x() + triangle->v3_->x()) * 0.5f; mid.y() = (triangle->v2_->y() + triangle->v3_->y()) * 0.5f; mid.z() = (triangle->v2_->z() + triangle->v3_->z()) * 0.5f; // Calculate the distance between the new, merged position, // and the original vertex position. diff1.Set(mid.x() - triangle->v2_->twin_->x(), mid.y() - triangle->v2_->twin_->y(), mid.z() - triangle->v2_->twin_->z()); diff2.Set(mid.x() - triangle->v3_->twin_->x(), mid.y() - triangle->v3_->twin_->y(), mid.z() - triangle->v3_->twin_->z()); error1 = diff1.GetLength() + triangle->v1_->error_; error2 = diff2.GetLength() + triangle->v2_->error_; error = (error1 + error2 + current_error) / 3.0f; if (error < min_error) { edge.v1_ = triangle->v1_; edge.v2_ = triangle->v2_; min_error = error; min_error1 = error1; min_error2 = error2; } // Test V3 and V1. mid.x() = (triangle->v3_->x() + triangle->v1_->x()) * 0.5f; mid.y() = (triangle->v3_->y() + triangle->v1_->y()) * 0.5f; mid.z() = (triangle->v3_->z() + triangle->v1_->z()) * 0.5f; // Calculate the distance between the new, merged position, // and the original vertex position. diff1.Set(mid.x() - triangle->v3_->twin_->x(), mid.y() - triangle->v3_->twin_->y(), mid.z() - triangle->v3_->twin_->z()); diff2.Set(mid.x() - triangle->v1_->twin_->x(), mid.y() - triangle->v1_->twin_->y(), mid.z() - triangle->v1_->twin_->z()); error1 = diff1.GetLength() + triangle->v1_->error_; error2 = diff2.GetLength() + triangle->v2_->error_; error = (error1 + error2 + current_error) / 3.0f; if (error < min_error) { edge.v1_ = triangle->v1_; edge.v2_ = triangle->v2_; min_error = error; min_error1 = error1; min_error2 = error2; } if (min_error == 0.0f && edge.v1_ != 0 && edge.v2_ != 0) break; } edge.v1_->error_ = min_error1; edge.v2_->error_ = min_error2; // Now add all triangles to _edge that share the two vertices // _edge->v1_ and _edge->v2_. for (tri_iter = triangle_list.begin(); tri_iter != triangle_list.end(); ++tri_iter) { Triangle* triangle = *tri_iter; if (triangle->HaveVertex(edge.v1_) && triangle->HaveVertex(edge.v2_)) { edge.triangle_list_.push_back(triangle); } } }