Merge branch 'master' into blender2.8
[blender.git] / source / blender / python / bmesh / bmesh_py_geometry.c
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  * The Original Code is Copyright (C) 2012 Blender Foundation.
19  * All rights reserved.
20  *
21  * Contributor(s): Campbell Barton
22  *
23  * ***** END GPL LICENSE BLOCK *****
24  */
25
26 /** \file blender/python/bmesh/bmesh_py_geometry.c
27  *  \ingroup pybmesh
28  *
29  * This file defines the 'bmesh.geometry' module.
30  * Utility functions for operating on 'bmesh.types'
31  */
32
33 #include <Python.h>
34
35 #include "BLI_utildefines.h"
36
37 #include "../mathutils/mathutils.h"
38
39 #include "bmesh.h"
40 #include "bmesh_py_types.h"
41 #include "bmesh_py_geometry.h" /* own include */
42
43 PyDoc_STRVAR(bpy_bm_geometry_intersect_face_point_doc,
44 ".. method:: intersect_face_point(face, point)\n"
45 "\n"
46 "   Tests if the projection of a point is inside a face (using the face's normal).\n"
47 "\n"
48 "   :arg face: The face to test.\n"
49 "   :type face: :class:`bmesh.types.BMFace`\n"
50 "   :arg point: The point to test.\n"
51 "   :type point: float triplet\n"
52 "   :return: True when the projection of the point is in the face.\n"
53 "   :rtype: bool\n"
54 );
55 static PyObject *bpy_bm_geometry_intersect_face_point(BPy_BMFace *UNUSED(self), PyObject *args)
56 {
57         BPy_BMFace *py_face;
58         PyObject *py_point;
59         float point[3];
60         bool ret;
61
62         if (!PyArg_ParseTuple(args,
63                               "O!O:intersect_face_point",
64                               &BPy_BMFace_Type, &py_face,
65                               &py_point))
66         {
67                 return NULL;
68         }
69
70         BPY_BM_CHECK_OBJ(py_face);
71         if (mathutils_array_parse(point, 3, 3, py_point, "intersect_face_point") == -1) {
72                 return NULL;
73         }
74
75         ret = BM_face_point_inside_test(py_face->f, point);
76
77         return PyBool_FromLong(ret);
78 }
79
80
81 static struct PyMethodDef BPy_BM_geometry_methods[] = {
82         {"intersect_face_point", (PyCFunction)bpy_bm_geometry_intersect_face_point, METH_VARARGS, bpy_bm_geometry_intersect_face_point_doc},
83         {NULL, NULL, 0, NULL}
84 };
85
86
87 PyDoc_STRVAR(BPy_BM_utils_doc,
88 "This module provides access to bmesh geometry evaluation functions."
89 );
90 static struct PyModuleDef BPy_BM_geometry_module_def = {
91         PyModuleDef_HEAD_INIT,
92         "bmesh.geometry",  /* m_name */
93         BPy_BM_utils_doc,  /* m_doc */
94         0,  /* m_size */
95         BPy_BM_geometry_methods,  /* m_methods */
96         NULL,  /* m_reload */
97         NULL,  /* m_traverse */
98         NULL,  /* m_clear */
99         NULL,  /* m_free */
100 };
101
102
103 PyObject *BPyInit_bmesh_geometry(void)
104 {
105         PyObject *submodule;
106
107         submodule = PyModule_Create(&BPy_BM_geometry_module_def);
108
109         return submodule;
110 }