Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- TriMesh* TriMesh::subdivideSqrt3() {
- vector<glm::vec3> points;
- vector<int> indices;
- int index = 0;
- for(int i = 0; i < m_triangles.size(); ++i){
- fprintf(stderr, "Started tri\n");
- Node* triNodes[3];
- glm::vec3 vertex1;
- glm::vec3 vertex2;
- glm::vec3 vertex3;
- triNodes[0] = m_triangles[i]->m_he_->m_from_;
- triNodes[1] = m_triangles[i]->m_he_->getNext()->m_from_;
- triNodes[2] = m_triangles[i]->m_he_->getPrev()->m_from_;
- vertex1 = triNodes[0]->m_pos_;
- vertex2 = triNodes[1]->m_pos_;
- vertex3 = triNodes[2]->m_pos_;
- for(int i = 0; i < 3; i++)
- {
- float n = 0.0f;
- Node* node = triNodes[i];
- glm::vec3 vertex = triNodes[i]->m_pos_;
- HalfEdge* next = node->m_he_;
- glm::vec3 neighbours = glm::vec3(0.0f, 0.0f, 0.0f);
- for(;;){
- n += 1.0f;
- next = next->m_twin_->m_next_;
- if (next == NULL || next == node->m_he_)
- break;
- }
- fprintf(stderr, "Number of neighbours: %f\n", n);
- //Calculate beta
- float beta = 4-(2*glm::cos((2*M_PI)/n));
- beta = beta/(9*n);
- next = node->m_he_;
- for(;;){
- neighbours += next->m_from_->m_pos_ - vertex;
- next = next->m_twin_->m_next_;
- if (next == NULL || next == node->m_he_)
- break;
- }
- //shift1 /= n1;
- //New vertex positions
- //vertex1 = (1-(beta*n1))*vertex1;
- //vertex1 = (1-beta)*vertex1 + beta*n1;
- //vertex1 += shift1;
- if(i == 0)
- vertex1 = (1-n*beta)*vertex1 + (beta*(neighbours));
- else if(i == 1)
- vertex2 = (1-n*beta)*vertex2 + (beta*(neighbours));
- else if(i == 2)
- vertex3 = (1-n*beta)*vertex3 + (beta*(neighbours));
- }
- fprintf(stderr, "found pos\n");
- glm::vec3 newVertex = vertex1 + vertex2 + vertex3;
- newVertex = newVertex/3.0f;
- fprintf(stderr, "Made verts\n");
- points.push_back(vertex1);
- points.push_back(vertex2);
- points.push_back(vertex3);
- points.push_back(newVertex);
- fprintf(stderr, "Added verts\n");
- indices.push_back(index+0);
- indices.push_back(index+1);
- indices.push_back(index+3);
- indices.push_back(index+1);
- indices.push_back(index+2);
- indices.push_back(index+3);
- indices.push_back(index+2);
- indices.push_back(index+0);
- indices.push_back(index+3);
- index += 4;
- fprintf(stderr, "Added indices: %d\n", indices.size());
- }
- return new TriMesh(points, indices);
- }
Advertisement
Add Comment
Please, Sign In to add comment