Fix build error on Windows 32 bit.
[blender-staging.git] / intern / dualcon / intern / Projections.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
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  * Contributor(s): Tao Ju
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 #ifndef __PROJECTIONS_H__
24 #define __PROJECTIONS_H__
25
26 #include <stdio.h>
27 #include <stdlib.h>
28
29 #define CONTAINS_INDEX
30 #define GRID_DIMENSION 20
31
32 #if defined(_WIN32) && !(_MSC_VER >= 1900)
33 #define isnan(n) _isnan(n)
34 #define LONG __int64
35 #define int64_t __int64
36 #else
37 #include <stdint.h>
38 #endif
39
40 /**
41 * Structures and classes for computing projections of triangles onto
42 * separating axes during scan conversion
43 *
44 * @author Tao Ju
45 */
46
47 extern const int vertmap[8][3];
48 extern const int centmap[3][3][3][2];
49 extern const int edgemap[12][2];
50 extern const int facemap[6][4];
51
52 /* Axes:
53  *  0,  1,  2: cube face normals
54  *    
55  *          3: triangle normal
56  *          
57  *  4,  5,  6,
58  *  7,  8,  9,
59  * 10, 11, 12: cross of each triangle edge vector with each cube
60  *             face normal
61  */
62 #define NUM_AXES 13
63
64 /**
65  * Structure for the projections inheritable from parent
66  */
67 struct TriangleProjection {
68         /// Projections of triangle (min and max)
69         int64_t tri_proj[NUM_AXES][2];
70
71         /// Normal of the triangle
72         double norm[3];
73
74         /// Index of polygon
75         int index;
76 };
77
78 /* This is a projection for the cube against a single projection
79    axis, see CubeTriangleIsect.cubeProj */
80 struct CubeProjection {
81         int64_t origin;
82         int64_t edges[3];
83         int64_t min, max;
84 };
85
86
87 /**
88  * Class for projections of cube / triangle vertices on the separating axes
89  */
90 class CubeTriangleIsect
91 {
92 public:
93         /// Inheritable portion
94         TriangleProjection *inherit;
95
96         /// Projections of the cube vertices
97         CubeProjection cubeProj[NUM_AXES];
98
99 public:
100         CubeTriangleIsect() {}
101
102         /**
103          * Construction from a cube (axes aligned) and triangle
104          */
105         CubeTriangleIsect(int64_t cube[2][3], int64_t trig[3][3], int64_t error, int triind);
106         
107         /**
108          * Construction from a parent CubeTriangleIsect object and the index of
109          * the children
110          */
111         CubeTriangleIsect(CubeTriangleIsect *parent);
112         
113         unsigned char getBoxMask( );
114
115         /**
116          * Shifting a cube to a new origin
117          */
118         void shift(int off[3]);
119
120         /**
121          * Method to test intersection of the triangle and the cube
122          */
123         int isIntersecting() const;
124
125         int isIntersectingPrimary(int edgeInd) const;
126
127         float getIntersectionPrimary(int edgeInd) const;
128
129 #ifdef WITH_CXX_GUARDEDALLOC
130         MEM_CXX_CLASS_ALLOC_FUNCS("DUALCON:CubeTriangleIsect")
131 #endif
132
133 };
134
135 #endif  /* __PROJECTIONS_H__ */