71b60cc4e4ab9af517848d3e46f92ebe628ca30e
[blender.git] / source / blender / editors / include / ED_navmesh_conversion.h
1 /**
2 * $Id$ 
3 *
4 * ***** BEGIN GPL LICENSE BLOCK *****
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 *
20 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21 * All rights reserved.
22 *
23 * The Original Code is: all of this file.
24 *
25 * Contributor(s): none yet.
26 *
27 * ***** END GPL LICENSE BLOCK *****
28 */
29
30 #ifndef NAVMESH_CONVERSION_H
31 #define NAVMESH_CONVERSION_H
32
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36
37 struct DerivedMesh;
38
39 /* navmesh_conversion.cpp */
40 bool buildNavMeshDataByDerivedMesh(DerivedMesh *dm, int& vertsPerPoly, 
41                                                                    int &nverts, float *&verts,
42                                                                    int &ndtris, unsigned short *&dtris,
43                                                                    int& npolys, unsigned short *&dmeshes,
44                                                                    unsigned short*& polys, int *&dtrisToPolysMap,
45                                                                    int *&dtrisToTrisMap, int *&trisToFacesMap);
46
47 bool buildRawVertIndicesData(DerivedMesh* dm, int &nverts, float *&verts, 
48                                 int &ntris, unsigned short *&tris, int *&trisToFacesMap,
49                                 int *&recastData);
50
51 bool buildNavMeshData(const int nverts, const float* verts, 
52                                           const int ntris, const unsigned short *tris, 
53                                           const int* recastData, const int* trisToFacesMap,
54                                           int &ndtris, unsigned short *&dtris,
55                                           int &npolys, unsigned short *&dmeshes, unsigned short *&polys,
56                                           int &vertsPerPoly, int *&dtrisToPolysMap, int *&dtrisToTrisMap);
57
58 bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys, 
59                                 unsigned short* polys, const unsigned short* dmeshes, 
60                                 const float* verts, const unsigned short* dtris, 
61                                 const int* dtrisToPolysMap);
62
63 int polyNumVerts(const unsigned short* p, const int vertsPerPoly);
64 bool polyIsConvex(const unsigned short* p, const int vertsPerPoly, const float* verts);
65 int polyFindVertex(const unsigned short* p, const int vertsPerPoly, unsigned short vertexIdx);
66 float distPointToSegmentSq(const float* point, const float* a, const float* b);
67
68
69 inline int bit(int a, int b)
70 {
71         return (a & (1 << b)) >> b;
72 }
73
74 inline void intToCol(int i, float* col)
75 {
76         int     r = bit(i, 0) + bit(i, 3) * 2 + 1;
77         int     g = bit(i, 1) + bit(i, 4) * 2 + 1;
78         int     b = bit(i, 2) + bit(i, 5) * 2 + 1;
79         col[0] = 1 - r*63.0f/255.0f;
80         col[1] = 1 - g*63.0f/255.0f;
81         col[2] = 1 - b*63.0f/255.0f;
82 }
83
84 inline float area2(const float* a, const float* b, const float* c)
85 {
86         return (b[0] - a[0]) * (c[2] - a[2]) - (c[0] - a[0]) * (b[2] - a[2]);
87 }
88 inline bool left(const float* a, const float* b, const float* c)
89 {
90         return area2(a, b, c) < 0;
91 }
92
93 #ifdef __cplusplus
94 }
95 #endif
96 #endif //NAVMESH_CONVERSION_H