Advertisement
Guest User

Untitled

a guest
Apr 10th, 2020
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.41 KB | None | 0 0
  1. #pragma once
  2. //Based on http://www.crownandcutlass.com/features/technicaldetails/frustum.html
  3.  
  4. #include <glm.hpp>
  5. #include <gtc/type_ptr.hpp>
  6.  
  7. float frustum[6][4];
  8.  
  9. void ExtractFrustum(glm::mat4 projection, glm::mat4 view)
  10. {
  11.     float   clip[16];
  12.     float   proj[16];
  13.     float   modl[16];
  14.     float   t;
  15.  
  16.     const float* pSource = (const float*)glm::value_ptr(projection);
  17.     for (int i = 0; i < 16; ++i)
  18.         proj[i] = pSource[i];
  19.  
  20.     const float* vSource = (const float*)glm::value_ptr(view);
  21.     for (int i = 0; i < 16; ++i)
  22.         modl[i] = vSource[i];
  23.  
  24.     /* Combine the two matrices (multiply projection by modelview) */
  25.     clip[0] = modl[0] * proj[0] + modl[1] * proj[4] + modl[2] * proj[8] + modl[3] * proj[12];
  26.     clip[1] = modl[0] * proj[1] + modl[1] * proj[5] + modl[2] * proj[9] + modl[3] * proj[13];
  27.     clip[2] = modl[0] * proj[2] + modl[1] * proj[6] + modl[2] * proj[10] + modl[3] * proj[14];
  28.     clip[3] = modl[0] * proj[3] + modl[1] * proj[7] + modl[2] * proj[11] + modl[3] * proj[15];
  29.  
  30.     clip[4] = modl[4] * proj[0] + modl[5] * proj[4] + modl[6] * proj[8] + modl[7] * proj[12];
  31.     clip[5] = modl[4] * proj[1] + modl[5] * proj[5] + modl[6] * proj[9] + modl[7] * proj[13];
  32.     clip[6] = modl[4] * proj[2] + modl[5] * proj[6] + modl[6] * proj[10] + modl[7] * proj[14];
  33.     clip[7] = modl[4] * proj[3] + modl[5] * proj[7] + modl[6] * proj[11] + modl[7] * proj[15];
  34.  
  35.     clip[8] = modl[8] * proj[0] + modl[9] * proj[4] + modl[10] * proj[8] + modl[11] * proj[12];
  36.     clip[9] = modl[8] * proj[1] + modl[9] * proj[5] + modl[10] * proj[9] + modl[11] * proj[13];
  37.     clip[10] = modl[8] * proj[2] + modl[9] * proj[6] + modl[10] * proj[10] + modl[11] * proj[14];
  38.     clip[11] = modl[8] * proj[3] + modl[9] * proj[7] + modl[10] * proj[11] + modl[11] * proj[15];
  39.  
  40.     clip[12] = modl[12] * proj[0] + modl[13] * proj[4] + modl[14] * proj[8] + modl[15] * proj[12];
  41.     clip[13] = modl[12] * proj[1] + modl[13] * proj[5] + modl[14] * proj[9] + modl[15] * proj[13];
  42.     clip[14] = modl[12] * proj[2] + modl[13] * proj[6] + modl[14] * proj[10] + modl[15] * proj[14];
  43.     clip[15] = modl[12] * proj[3] + modl[13] * proj[7] + modl[14] * proj[11] + modl[15] * proj[15];
  44.  
  45.     /* Extract the numbers for the RIGHT plane */
  46.     frustum[0][0] = clip[3] - clip[0];
  47.     frustum[0][1] = clip[7] - clip[4];
  48.     frustum[0][2] = clip[11] - clip[8];
  49.     frustum[0][3] = clip[15] - clip[12];
  50.  
  51.     /* Normalize the result */
  52.     t = sqrt(frustum[0][0] * frustum[0][0] + frustum[0][1] * frustum[0][1] + frustum[0][2] * frustum[0][2]);
  53.     frustum[0][0] /= t;
  54.     frustum[0][1] /= t;
  55.     frustum[0][2] /= t;
  56.     frustum[0][3] /= t;
  57.  
  58.     /* Extract the numbers for the LEFT plane */
  59.     frustum[1][0] = clip[3] + clip[0];
  60.     frustum[1][1] = clip[7] + clip[4];
  61.     frustum[1][2] = clip[11] + clip[8];
  62.     frustum[1][3] = clip[15] + clip[12];
  63.  
  64.     /* Normalize the result */
  65.     t = sqrt(frustum[1][0] * frustum[1][0] + frustum[1][1] * frustum[1][1] + frustum[1][2] * frustum[1][2]);
  66.     frustum[1][0] /= t;
  67.     frustum[1][1] /= t;
  68.     frustum[1][2] /= t;
  69.     frustum[1][3] /= t;
  70.  
  71.     /* Extract the BOTTOM plane */
  72.     frustum[2][0] = clip[3] + clip[1];
  73.     frustum[2][1] = clip[7] + clip[5];
  74.     frustum[2][2] = clip[11] + clip[9];
  75.     frustum[2][3] = clip[15] + clip[13];
  76.  
  77.     /* Normalize the result */
  78.     t = sqrt(frustum[2][0] * frustum[2][0] + frustum[2][1] * frustum[2][1] + frustum[2][2] * frustum[2][2]);
  79.     frustum[2][0] /= t;
  80.     frustum[2][1] /= t;
  81.     frustum[2][2] /= t;
  82.     frustum[2][3] /= t;
  83.  
  84.     /* Extract the TOP plane */
  85.     frustum[3][0] = clip[3] - clip[1];
  86.     frustum[3][1] = clip[7] - clip[5];
  87.     frustum[3][2] = clip[11] - clip[9];
  88.     frustum[3][3] = clip[15] - clip[13];
  89.  
  90.     /* Normalize the result */
  91.     t = sqrt(frustum[3][0] * frustum[3][0] + frustum[3][1] * frustum[3][1] + frustum[3][2] * frustum[3][2]);
  92.     frustum[3][0] /= t;
  93.     frustum[3][1] /= t;
  94.     frustum[3][2] /= t;
  95.     frustum[3][3] /= t;
  96.  
  97.     /* Extract the FAR plane */
  98.     frustum[4][0] = clip[3] - clip[2];
  99.     frustum[4][1] = clip[7] - clip[6];
  100.     frustum[4][2] = clip[11] - clip[10];
  101.     frustum[4][3] = clip[15] - clip[14];
  102.  
  103.     /* Normalize the result */
  104.     t = sqrt(frustum[4][0] * frustum[4][0] + frustum[4][1] * frustum[4][1] + frustum[4][2] * frustum[4][2]);
  105.     frustum[4][0] /= t;
  106.     frustum[4][1] /= t;
  107.     frustum[4][2] /= t;
  108.     frustum[4][3] /= t;
  109.  
  110.     /* Extract the NEAR plane */
  111.     frustum[5][0] = clip[3] + clip[2];
  112.     frustum[5][1] = clip[7] + clip[6];
  113.     frustum[5][2] = clip[11] + clip[10];
  114.     frustum[5][3] = clip[15] + clip[14];
  115.  
  116.     /* Normalize the result */
  117.     t = sqrt(frustum[5][0] * frustum[5][0] + frustum[5][1] * frustum[5][1] + frustum[5][2] * frustum[5][2]);
  118.     frustum[5][0] /= t;
  119.     frustum[5][1] /= t;
  120.     frustum[5][2] /= t;
  121.     frustum[5][3] /= t;
  122. }
  123.  
  124. bool PointInFrustum(glm::vec3 point)
  125. {
  126.     int p;
  127.     for (p = 0; p < 6; p++)
  128.         if (frustum[p][0] * point.x + frustum[p][1] * point.y + frustum[p][2] * point.z + frustum[p][3] <= 0)
  129.             return false;
  130.     return true;
  131. }
  132.  
  133. bool CubeInFrustum(glm::vec3 corner, glm::vec3 size)
  134. {
  135.     int p;
  136.  
  137.     for (p = 0; p < 6; p++)
  138.     {
  139.         if (frustum[p][0] * (corner.x) + frustum[p][1] * (corner.y) + frustum[p][2] * (corner.z) + frustum[p][3] > 0)
  140.             continue;
  141.         if (frustum[p][0] * (corner.x + size.x) + frustum[p][1] * (corner.y) + frustum[p][2] * (corner.z) + frustum[p][3] > 0)
  142.             continue;
  143.         if (frustum[p][0] * (corner.x) + frustum[p][1] * (corner.y + size.y) + frustum[p][2] * (corner.z) + frustum[p][3] > 0)
  144.             continue;
  145.         if (frustum[p][0] * (corner.x + size.x) + frustum[p][1] * (corner.y + size.y) + frustum[p][2] * (corner.z) + frustum[p][3] > 0)
  146.             continue;
  147.         if (frustum[p][0] * (corner.x) + frustum[p][1] * (corner.y) + frustum[p][2] * (corner.z + size.z) + frustum[p][3] > 0)
  148.             continue;
  149.         if (frustum[p][0] * (corner.x + size.x) + frustum[p][1] * (corner.y) + frustum[p][2] * (corner.z + size.z) + frustum[p][3] > 0)
  150.             continue;
  151.         if (frustum[p][0] * (corner.x) + frustum[p][1] * (corner.y + size.y) + frustum[p][2] * (corner.z + size.z) + frustum[p][3] > 0)
  152.             continue;
  153.         if (frustum[p][0] * (corner.x + size.x) + frustum[p][1] * (corner.y + size.y) + frustum[p][2] * (corner.z + size.z) + frustum[p][3] > 0)
  154.             continue;
  155.         return false;
  156.     }
  157.     return true;
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement