Advertisement
dragonslayer0531

Normal Calculation

Nov 16th, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.34 KB | None | 0 0
  1. {
  2.     // face normals
  3.     luminos_hash_map<glm::u32vec3, glm::f32vec3> face_normals;
  4.     luminos_hash_map<uint32_t, luminos_vector<uint32_t>> index_positions;
  5.     for (uint32_t i = 0; i < indices.size(); i += 3)
  6.     {
  7.         const glm::vec3 p1(positions[3 * (indices[i + 0]) + 0], positions[3 * (indices[i + 0]) + 1], positions[3 * (indices[i + 0]) + 2]);
  8.         const glm::vec3 p2(positions[3 * (indices[i + 1]) + 0], positions[3 * (indices[i + 1]) + 1], positions[3 * (indices[i + 1]) + 2]);
  9.         const glm::vec3 p3(positions[3 * (indices[i + 2]) + 0], positions[3 * (indices[i + 2]) + 1], positions[3 * (indices[i + 2]) + 2]);
  10.         const auto v1 = p2 - p1;
  11.         const auto v2 = p3 - p1;
  12.         const auto normal = glm::cross(v1, v2);
  13.         glm::u32vec3 face_indices(indices[i], indices[i + 1], indices[i + 2]);
  14.         glm::f32vec3 face_normal(normal);
  15.  
  16.         face_normals.insert(luminos_pair<glm::u32vec3, glm::f32vec3>(face_indices, face_normal));
  17.         if (index_positions.find(indices[i]) == index_positions.end())
  18.         {
  19.             luminos_vector<uint32_t> idx_pos = { i };
  20.             index_positions.insert(luminos_pair<uint32_t, luminos_vector<uint32_t>>(indices[i], idx_pos));
  21.         }
  22.         else
  23.         {
  24.             index_positions.find(i)->second.push_back(i);
  25.         }
  26.         if (index_positions.find(indices[i + 1]) == index_positions.end())
  27.         {
  28.             luminos_vector<uint32_t> idx_pos = { i + 1 };
  29.             index_positions.insert(luminos_pair<uint32_t, luminos_vector<uint32_t>>(indices[i + 1], idx_pos));
  30.         }
  31.         else
  32.         {
  33.             index_positions.find(i)->second.push_back(i + 1);
  34.         }
  35.         if (index_positions.find(indices[i + 2]) == index_positions.end())
  36.         {
  37.             luminos_vector<uint32_t> idx_pos = { i + 2 };
  38.             index_positions.insert(luminos_pair<uint32_t, luminos_vector<uint32_t>>(indices[i + 2], idx_pos));
  39.         }
  40.         else
  41.         {
  42.             index_positions.find(i)->second.push_back(i + 2);
  43.         }
  44.     }
  45.     // vertex normals
  46.     for (auto i = 0; i < positions.size() / 3; i++)
  47.     {
  48.         glm::vec3 normal;
  49.         auto indices = index_positions.find(i)->second;
  50.         for (auto ind : indices)
  51.         {
  52.             const auto rem = ind % 3;
  53.             const auto p1 = ind - rem + 0;
  54.             const auto p2 = ind - rem + 1;
  55.             const auto p3 = ind - rem + 2;
  56.  
  57.             glm::u32vec3 face(p1, p2, p3);
  58.             glm::f32vec3 norm = face_normals.find(face)->second;
  59.             normal += norm;
  60.         }
  61.         const auto norm = glm::normalize(normal);
  62.         normals.push_back(norm.x);
  63.         normals.push_back(norm.y);
  64.         normals.push_back(norm.z);
  65.     }
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement