kick
/Users/morten/Programmering/cpp/kick/src/kick/math/bounds3.cpp
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 }
 All Classes Functions Variables