Field3D
CoordSys.h
Go to the documentation of this file.
1 //----------------------------------------------------------------------------//
2 
3 /*
4  * Copyright (c) 2014 Sony Pictures Imageworks Inc
5  *
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * Redistributions of source code must retain the above copyright
13  * notice, this list of conditions and the following disclaimer.
14  * Redistributions in binary form must reproduce the above copyright
15  * notice, this list of conditions and the following disclaimer in the
16  * documentation and/or other materials provided with the
17  * distribution. Neither the name of Sony Pictures Imageworks nor the
18  * names of its contributors may be used to endorse or promote
19  * products derived from this software without specific prior written
20  * permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
33  * OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35 
36 //----------------------------------------------------------------------------//
37 
42 //----------------------------------------------------------------------------//
43 
44 #ifndef _INCLUDED_Field3D_CoordSys_H_
45 #define _INCLUDED_Field3D_CoordSys_H_
46 
47 //----------------------------------------------------------------------------//
48 
49 // System includes
50 #include <cmath>
51 
52 #include "Types.h"
53 
54 //----------------------------------------------------------------------------//
55 
56 #include "ns.h"
57 
59 
60 //----------------------------------------------------------------------------//
61 // Utility functions
62 //----------------------------------------------------------------------------//
63 
65 template <typename T>
66 FIELD3D_MTX_T<T> coordinateSystem(const FIELD3D_VEC3_T<T> &e1,
67  const FIELD3D_VEC3_T<T> &e2,
68  const FIELD3D_VEC3_T<T> &e3,
69  const FIELD3D_VEC3_T<T> &origin);
70 
72 template <typename T>
73 FIELD3D_MTX_T<T>
74 coordinateSystem(const FIELD3D_BOX_T<FIELD3D_VEC3_T<T> > &wsBounds);
75 
79 template <typename T>
80 FIELD3D_MTX_T<T>
81 coordinateSystem(const FIELD3D_BOX_T<FIELD3D_VEC3_T<T> > &wsBounds,
82  const FIELD3D_VEC3_T<T> &wsVoxelSize);
83 
84 //----------------------------------------------------------------------------//
85 // Detail namespace
86 //----------------------------------------------------------------------------//
87 
88 namespace detail {
89 
90  //--------------------------------------------------------------------------//
91 
93  template <typename T>
94  FIELD3D_VEC3_T<T>
95  floor(const FIELD3D_VEC3_T<T> &v)
96  {
97  return FIELD3D_VEC3_T<T>(std::floor(v.x), std::floor(v.y), std::floor(v.z));
98  }
99 
100  //--------------------------------------------------------------------------//
101 
103  template <typename T>
104  FIELD3D_VEC3_T<T>
105  ceil(const FIELD3D_VEC3_T<T> &v)
106  {
107  return FIELD3D_VEC3_T<T>(std::ceil(v.x), std::ceil(v.y), std::ceil(v.z));
108  }
109 
110  //--------------------------------------------------------------------------//
111 
112 } // Detail namespace
113 
114 //----------------------------------------------------------------------------//
115 // Template implementations
116 //----------------------------------------------------------------------------//
117 
118 template <typename T>
119 FIELD3D_MTX_T<T> coordinateSystem(const FIELD3D_VEC3_T<T> &e1,
120  const FIELD3D_VEC3_T<T> &e2,
121  const FIELD3D_VEC3_T<T> &e3,
122  const FIELD3D_VEC3_T<T> &origin)
123 {
124  FIELD3D_MTX_T<T> m;
125  m[0][0] = e1.x;
126  m[0][1] = e1.y;
127  m[0][2] = e1.z;
128  m[1][0] = e2.x;
129  m[1][1] = e2.y;
130  m[1][2] = e2.z;
131  m[2][0] = e3.x;
132  m[2][1] = e3.y;
133  m[2][2] = e3.z;
134  m[3][0] = origin.x;
135  m[3][1] = origin.y;
136  m[3][2] = origin.z;
137  return m;
138 }
139 
140 //----------------------------------------------------------------------------//
141 
142 template <typename T>
143 FIELD3D_MTX_T<T>
145 (const FIELD3D_BOX_T<FIELD3D_VEC3_T<T> > &wsBounds,
146  const FIELD3D_VEC3_T<T> &wsVoxelSize)
147 {
148  const FIELD3D_VEC3_T<T> voxelMin =
149  detail::floor<T>(wsBounds.min / wsVoxelSize) * wsVoxelSize;
150  const FIELD3D_VEC3_T<T> voxelMax =
151  detail::ceil<T>(wsBounds.max / wsVoxelSize) * wsVoxelSize;
152 
153  const FIELD3D_BOX_T<FIELD3D_VEC3_T<T> > box(voxelMin, voxelMax);
154 
155  return coordinateSystem(box);
156 }
157 
158 //----------------------------------------------------------------------------//
159 
160 template <typename T>
161 FIELD3D_MTX_T<T>
163 (const FIELD3D_BOX_T<FIELD3D_VEC3_T<T> > &wsBounds)
164 {
165  FIELD3D_VEC3_T<T> e1(wsBounds.max.x - wsBounds.min.x, 0, 0);
166  FIELD3D_VEC3_T<T> e2(0, wsBounds.max.y - wsBounds.min.y, 0);
167  FIELD3D_VEC3_T<T> e3(0, 0, wsBounds.max.z - wsBounds.min.z);
168  FIELD3D_VEC3_T<T> origin(wsBounds.min);
169  return coordinateSystem(e1, e2, e3, origin);
170 }
171 
172 //----------------------------------------------------------------------------//
173 
175 
176 //----------------------------------------------------------------------------//
177 
178 #endif // Include guard
#define FIELD3D_NAMESPACE_HEADER_CLOSE
Definition: ns.h:58
Contains typedefs for the commonly used types in Field3D.
FIELD3D_NAMESPACE_OPEN FIELD3D_MTX_T< T > coordinateSystem(const FIELD3D_VEC3_T< T > &e1, const FIELD3D_VEC3_T< T > &e2, const FIELD3D_VEC3_T< T > &e3, const FIELD3D_VEC3_T< T > &origin)
Constructs a coordinate systems given a set of basis vectors and an origin.
Definition: CoordSys.h:119
#define FIELD3D_BOX_T
Definition: StdMathLib.h:75
FIELD3D_VEC3_T< T > floor(const FIELD3D_VEC3_T< T > &v)
Floor function for Vec3.
Definition: CoordSys.h:95
FIELD3D_VEC3_T< T > ceil(const FIELD3D_VEC3_T< T > &v)
Ceil function for Vec3.
Definition: CoordSys.h:105