Advertisement
Guest User

Untitled

a guest
Nov 14th, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.69 KB | None | 0 0
  1.     // generate bounding box
  2.     glm::vec3 minbox(std::numeric_limits<float>::max());
  3.     glm::vec3 maxbox(std::numeric_limits<float>::min());
  4.     for (const auto& v : vertices)
  5.     {
  6.         if (v.Position.x > maxbox.x)
  7.             maxbox.x = v.Position.x;
  8.         if (v.Position.x < minbox.x)
  9.             minbox.x = v.Position.x;
  10.         if (v.Position.y > maxbox.y)
  11.             maxbox.y = v.Position.y;
  12.         if (v.Position.y < minbox.y)
  13.             minbox.y = v.Position.y;
  14.         if (v.Position.z > maxbox.z)
  15.             maxbox.z = v.Position.z;
  16.         if (v.Position.z < minbox.z)
  17.             minbox.z = v.Position.z;
  18.     }
  19.     glm::vec3 center = (maxbox + minbox) / 2.f;
  20.     min = minbox;
  21.     max = maxbox;
  22.     mid = center;
  23.     // translate bounding box to center
  24.     maxbox -= center;
  25.     minbox -= center;
  26.  
  27.     switch (func)
  28.     {
  29.     case ProjectorFn::Cube:
  30.         for (auto& v : vertices)
  31.         {
  32.             glm::vec3 absVec(0);
  33.             if (entity == TexEntity::Normal)
  34.                 absVec = glm::abs(v.Normal);
  35.             else
  36.                 absVec = glm::abs(v.Position);
  37.             glm::vec2 UV(0);
  38.  
  39.             // +-X
  40.             if (absVec.x >= absVec.y && absVec.x >= absVec.z)
  41.             {
  42.                 (v.Position.x < 0.0) ? (UV.s = v.Position.z) : (UV.s = -v.Position.z);
  43.                 UV.t = v.Position.y;
  44.                 UV.s /= maxbox.z;
  45.                 UV.t /= maxbox.y;
  46.                 //UV.s /= absVec.x;
  47.                 //UV.t /= absVec.x;
  48.             }
  49.             // +-Y
  50.             else if (absVec.y >= absVec.x && absVec.y >= absVec.z)
  51.             {
  52.                 (v.Position.y < 0.0) ? (UV.t = v.Position.z) : (UV.t = -v.Position.z);
  53.                 UV.s = v.Position.x;
  54.                 UV.s /= maxbox.x;
  55.                 UV.t /= maxbox.z;
  56.             }
  57.             // +-Z
  58.             else
  59.             {
  60.                 (v.Position.z < 0.0) ? (UV.s = -v.Position.x) : (UV.s = v.Position.x);
  61.                 UV.t = v.Position.y;
  62.                 UV.s /= maxbox.x;
  63.                 UV.t /= maxbox.y;
  64.             }
  65.  
  66.             UV = (UV + 1.f) / 2.f;
  67.             v.TexCoords = UV;
  68.         }
  69.         break;
  70.     case ProjectorFn::Sphere:
  71.         for (auto& v : vertices)
  72.         {
  73.             glm::vec3 tpos;
  74.             if (entity == TexEntity::Position)
  75.                 tpos = v.Position - center;
  76.             else if (entity == TexEntity::Normal)
  77.                 tpos = v.Normal;
  78.             float theta = glm::atan(tpos.y / tpos.x);
  79.             float Z = (tpos.z - minbox.z) / (maxbox.z - minbox.z);
  80.             float r = glm::length(tpos);
  81.             float phi = glm::acos(tpos.z / r);
  82.             float U = theta / glm::two_pi<float>(); // convert to 0-1 range
  83.             float V = (glm::pi<float>() - phi) / (glm::pi<float>());
  84.             v.TexCoords = { U, V };
  85.         }
  86.         break;
  87.     case ProjectorFn::Cylinder:
  88.         for (auto& v : vertices)
  89.         {
  90.             glm::vec3 tpos;
  91.             if (entity == TexEntity::Position)
  92.                 tpos = v.Position - center;
  93.             else if (entity == TexEntity::Normal)
  94.                 tpos = v.Normal;
  95.             float theta = glm::atan(tpos.y / tpos.x);
  96.             float Z = (tpos.z - minbox.z) / (maxbox.z - minbox.z);
  97.             float U = theta / glm::two_pi<float>(); // convert to 0-1 range
  98.             float V = Z;
  99.             v.TexCoords = { U, V };
  100.         }
  101.         break;
  102.     default:
  103.         break;
  104.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement