ClangFormat: apply to source, most of intern
[blender.git] / intern / dualcon / intern / Projections.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 #ifndef __PROJECTIONS_H__
18 #define __PROJECTIONS_H__
19
20 #include <stdio.h>
21 #include <stdlib.h>
22
23 #define CONTAINS_INDEX
24 #define GRID_DIMENSION 20
25
26 #if defined(_WIN32) && !(_MSC_VER >= 1900)
27 #  define isnan(n) _isnan(n)
28 #  define LONG __int64
29 #  define int64_t __int64
30 #else
31 #  include <stdint.h>
32 #endif
33
34 /**
35 * Structures and classes for computing projections of triangles onto
36 * separating axes during scan conversion
37 *
38 * @author Tao Ju
39 */
40
41 extern const int vertmap[8][3];
42 extern const int centmap[3][3][3][2];
43 extern const int edgemap[12][2];
44 extern const int facemap[6][4];
45
46 /* Axes:
47  *  0,  1,  2: cube face normals
48  *    
49  *          3: triangle normal
50  *          
51  *  4,  5,  6,
52  *  7,  8,  9,
53  * 10, 11, 12: cross of each triangle edge vector with each cube
54  *             face normal
55  */
56 #define NUM_AXES 13
57
58 /**
59  * Structure for the projections inheritable from parent
60  */
61 struct TriangleProjection {
62   /// Projections of triangle (min and max)
63   int64_t tri_proj[NUM_AXES][2];
64
65   /// Normal of the triangle
66   double norm[3];
67
68   /// Index of polygon
69   int index;
70 };
71
72 /* This is a projection for the cube against a single projection
73    axis, see CubeTriangleIsect.cubeProj */
74 struct CubeProjection {
75   int64_t origin;
76   int64_t edges[3];
77   int64_t min, max;
78 };
79
80 /**
81  * Class for projections of cube / triangle vertices on the separating axes
82  */
83 class CubeTriangleIsect {
84  public:
85   /// Inheritable portion
86   TriangleProjection *inherit;
87
88   /// Projections of the cube vertices
89   CubeProjection cubeProj[NUM_AXES];
90
91  public:
92   CubeTriangleIsect()
93   {
94   }
95
96   /**
97    * Construction from a cube (axes aligned) and triangle
98    */
99   CubeTriangleIsect(int64_t cube[2][3], int64_t trig[3][3], int64_t error, int triind);
100
101   /**
102    * Construction from a parent CubeTriangleIsect object and the index of
103    * the children
104    */
105   CubeTriangleIsect(CubeTriangleIsect *parent);
106
107   unsigned char getBoxMask();
108
109   /**
110    * Shifting a cube to a new origin
111    */
112   void shift(int off[3]);
113
114   /**
115    * Method to test intersection of the triangle and the cube
116    */
117   int isIntersecting() const;
118
119   int isIntersectingPrimary(int edgeInd) const;
120
121   float getIntersectionPrimary(int edgeInd) const;
122
123 #ifdef WITH_CXX_GUARDEDALLOC
124   MEM_CXX_CLASS_ALLOC_FUNCS("DUALCON:CubeTriangleIsect")
125 #endif
126 };
127
128 #endif /* __PROJECTIONS_H__ */