kick
|
00001 // 00002 // Created by Morten Nobel-Jørgensen on 08/09/14. 00003 // 00004 00005 #include "bounds3.h" 00006 00007 namespace kick{ 00008 00009 Bounds3::Bounds3() { 00010 } 00011 00012 Bounds3::Bounds3(glm::vec3 const &min, glm::vec3 const &max) : min(min), max(max) { 00013 } 00014 00015 void Bounds3::expand(glm::vec3 p) { 00016 min = glm::min(min, p); 00017 max = glm::max(max, p); 00018 } 00019 00020 void Bounds3::expand(Bounds3 b) { 00021 min = glm::min(min, b.min); 00022 max = glm::max(max, b.max); 00023 } 00024 00025 void Bounds3::reset() { 00026 min = glm::vec3{ std::numeric_limits<float>::max() }; 00027 max = glm::vec3{ std::numeric_limits<float>::lowest() }; 00028 } 00029 00030 Bounds3 Bounds3::lerp(float f, Bounds3 b) { 00031 return Bounds3 {glm::mix(min, b.min, f), glm::mix(max, b.max, f)}; 00032 00033 } 00034 00035 bool Bounds3::contains(glm::vec3 point) { 00036 return min.x <= point.x && min.y <= point.y && min.z <= point.z && 00037 max.x >= point.x && max.y >= point.y && max.z >= point.z 00038 ; 00039 } 00040 00041 glm::vec3 Bounds3::dimension() { return max-min; } 00042 00043 glm::vec3 Bounds3::center() { return (max+min)*0.5f; } 00044 00045 glm::vec3 Bounds3::diagonal() { return (max-min); } 00046 00047 Bounds3 Bounds3::transform(glm::mat4 trans){ 00048 glm::vec3 values[2] = {min, max}; 00049 Bounds3 res; 00050 for (int x = 0; x < 2; x++){ 00051 for (int y = 0; y < 2; y++){ 00052 for (int z = 0; z < 2; z++){ 00053 glm::vec4 t = trans * glm::vec4(values[x].x, values[y].y, values[z].z, 1.0); 00054 res.expand((glm::vec3)t); 00055 } 00056 } 00057 } 00058 return res; 00059 00060 } 00061 00062 std::vector<glm::vec3> Bounds3::toLines() { 00063 std::vector<glm::vec3> res; 00064 res.push_back(max); 00065 res.push_back(glm::vec3(max.x,max.y,min.z)); 00066 res.push_back(max); 00067 res.push_back(glm::vec3(max.x,min.y,max.z)); 00068 res.push_back(max); 00069 res.push_back(glm::vec3(min.x,max.y,max.z)); 00070 00071 res.push_back(min); 00072 res.push_back(glm::vec3(min.x,min.y,max.z)); 00073 res.push_back(min); 00074 res.push_back(glm::vec3(min.x,max.y,min.z)); 00075 res.push_back(min); 00076 res.push_back(glm::vec3(max.x,min.y,min.z)); 00077 00078 res.push_back(glm::vec3(max.x,max.y,min.z)); 00079 res.push_back(glm::vec3(max.x,min.y,min.z)); 00080 00081 res.push_back(glm::vec3(max.x,max.y,min.z)); 00082 res.push_back(glm::vec3(min.x,max.y,min.z)); 00083 00084 res.push_back(glm::vec3(min.x,max.y,min.z)); 00085 res.push_back(glm::vec3(min.x,max.y,max.z)); 00086 00087 res.push_back(glm::vec3(min.x,max.y,max.z)); 00088 res.push_back(glm::vec3(min.x,min.y,max.z)); 00089 00090 res.push_back(glm::vec3(min.x,min.y,max.z)); 00091 res.push_back(glm::vec3(max.x,min.y,max.z)); 00092 00093 res.push_back(glm::vec3(max.x,min.y,max.z)); 00094 res.push_back(glm::vec3(max.x,min.y,min.z)); 00095 return res; 00096 } 00097 }