Fix #29444: cycles problem building BVH with NaN vertices.
[blender.git] / intern / cycles / util / util_boundbox.h
1 /*
2  * Copyright 2011, Blender Foundation.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18
19 #ifndef __UTIL_BOUNDBOX_H__
20 #define __UTIL_BOUNDBOX_H__
21
22 #include <float.h>
23
24 #include "util_math.h"
25 #include "util_transform.h"
26 #include "util_types.h"
27
28 CCL_NAMESPACE_BEGIN
29
30 class BoundBox
31 {
32 public:
33         float3 min, max;
34
35         BoundBox(void)
36         {
37                 min = make_float3(FLT_MAX, FLT_MAX, FLT_MAX);
38                 max = make_float3(-FLT_MAX, -FLT_MAX, -FLT_MAX);
39         }
40
41         BoundBox(const float3& min_, const float3& max_)
42         : min(min_), max(max_)
43         {
44         }
45
46         void grow(const float3& pt)  
47         {
48                 min = ccl::min(min, pt);
49                 max = ccl::max(max, pt);
50         }
51
52         void grow(const BoundBox& bbox)
53         {
54                 grow(bbox.min);
55                 grow(bbox.max);
56         }
57
58         void intersect(const BoundBox& bbox) 
59         {
60                 min = ccl::max(min, bbox.min);
61                 max = ccl::min(max, bbox.max);
62         }
63
64         float area(void) const
65         {
66                 if(!valid())
67                         return 0.0f;
68
69                 float3 d = max - min;
70                 return dot(d, d)*2.0f;
71         }
72
73         bool valid(void) const
74         {
75                 return (min.x <= max.x) && (min.y <= max.y) && (min.z <= max.z) &&
76                        !(isnan(min.x) || isnan(min.y) || isnan(min.z)) &&
77                        !(isnan(max.x) || isnan(max.y) || isnan(max.z));
78         }
79
80         BoundBox transformed(const Transform *tfm)
81         {
82                 BoundBox result;
83
84                 for(int i = 0; i < 8; i++) {
85                         float3 p;
86
87                         p.x = (i & 1)? min.x: max.x;
88                         p.y = (i & 2)? min.y: max.y;
89                         p.z = (i & 4)? min.z: max.z;
90
91                         result.grow(transform(tfm, p));
92                 }
93
94                 return result;
95         }
96 };
97
98 CCL_NAMESPACE_END
99
100 #endif /* __UTIL_BOUNDBOX_H__ */
101