diff --git a/base/frustum.hpp b/base/frustum.hpp new file mode 100644 index 00000000..cf9e5731 --- /dev/null +++ b/base/frustum.hpp @@ -0,0 +1,71 @@ +/* +* View frustum culling class +* +* Copyright (C) 2016 by Sascha Willems - www.saschawillems.de +* +* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) +*/ + +#include +#include "glm\glm.hpp" + +namespace vkTools +{ + class Frustum + { + private: + enum side { LEFT = 0, RIGHT = 1, TOP = 2, BOTTOM = 3, BACK = 4, FRONT = 5 }; + std::array planes; + public: + void update(glm::mat4 matrix) + { + planes[LEFT].x = matrix[0].w + matrix[0].x; + planes[LEFT].y = matrix[1].w + matrix[1].x; + planes[LEFT].z = matrix[2].w + matrix[2].x; + planes[LEFT].w = matrix[3].w + matrix[3].x; + + planes[RIGHT].x = matrix[0].w - matrix[0].x; + planes[RIGHT].y = matrix[1].w - matrix[1].x; + planes[RIGHT].z = matrix[2].w - matrix[2].x; + planes[RIGHT].w = matrix[3].w - matrix[3].x; + + planes[TOP].x = matrix[0].w - matrix[0].y; + planes[TOP].y = matrix[1].w - matrix[1].y; + planes[TOP].z = matrix[2].w - matrix[2].y; + planes[TOP].w = matrix[3].w - matrix[3].y; + + planes[BOTTOM].x = matrix[0].w + matrix[0].y; + planes[BOTTOM].y = matrix[1].w + matrix[1].y; + planes[BOTTOM].z = matrix[2].w + matrix[2].y; + planes[BOTTOM].w = matrix[3].w + matrix[3].y; + + planes[BACK].x = matrix[0].w + matrix[0].z; + planes[BACK].y = matrix[1].w + matrix[1].z; + planes[BACK].z = matrix[2].w + matrix[2].z; + planes[BACK].w = matrix[3].w + matrix[3].z; + + planes[FRONT].x = matrix[0].w - matrix[0].z; + planes[FRONT].y = matrix[1].w - matrix[1].z; + planes[FRONT].z = matrix[2].w - matrix[2].z; + planes[FRONT].w = matrix[3].w - matrix[3].z; + + for (auto i = 0; i < planes.size(); i++) + { + float length = std::sqrtf(planes[i].x * planes[i].x + planes[i].y * planes[i].y + planes[i].z * planes[i].z); + planes[i] /= length; + } + } + + bool checkSphere(glm::vec3 pos, float radius) + { + for (auto i = 0; i < planes.size(); i++) + { + if ((planes[i].x * pos.x) + (planes[i].y * pos.y) + (planes[i].z * pos.z) + planes[i].w <= -radius) + { + return false; + } + } + return true; + } + }; +}