Merge branch 'master' into blender2.8
[blender.git] / source / blender / blenkernel / BKE_subdiv_eval.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  * The Original Code is Copyright (C) 2018 by Blender Foundation.
19  * All rights reserved.
20  *
21  * Contributor(s): Sergey Sharybin.
22  *
23  * ***** END GPL LICENSE BLOCK *****
24  */
25
26 /** \file BKE_subdiv_eval.h
27  *  \ingroup bke
28  *  \since September 2018
29  *  \author Sergey Sharybin
30  */
31
32 #ifndef __BKE_SUBDIV_EVAL_H__
33 #define __BKE_SUBDIV_EVAL_H__
34
35 #include "BLI_sys_types.h"
36
37 struct Mesh;
38 struct Subdiv;
39
40 /* Returns true if evaluator is ready for use. */
41 bool BKE_subdiv_eval_begin(struct Subdiv *subdiv);
42 bool BKE_subdiv_eval_update_from_mesh(struct Subdiv *subdiv,
43                                       const struct Mesh *mesh);
44
45 /* Single point queries. */
46
47 void BKE_subdiv_eval_limit_point(
48         struct Subdiv *subdiv,
49         const int ptex_face_index,
50         const float u, const float v,
51         float r_P[3]);
52 void BKE_subdiv_eval_limit_point_and_derivatives(
53         struct Subdiv *subdiv,
54         const int ptex_face_index,
55         const float u, const float v,
56         float r_P[3], float r_dPdu[3], float r_dPdv[3]);
57 void BKE_subdiv_eval_limit_point_and_normal(
58         struct Subdiv *subdiv,
59         const int ptex_face_index,
60         const float u, const float v,
61         float r_P[3], float r_N[3]);
62 void BKE_subdiv_eval_limit_point_and_short_normal(
63         struct Subdiv *subdiv,
64         const int ptex_face_index,
65         const float u, const float v,
66         float r_P[3], short r_N[3]);
67
68 void BKE_subdiv_eval_face_varying(
69         struct Subdiv *subdiv,
70         const int face_varying_channel,
71         const int ptex_face_index,
72         const float u, const float v,
73         float r_varying[2]);
74
75 /* NOTE: Expects derivatives to be correct.
76  *
77  * TODO(sergey): This is currently used together with
78  * BKE_subdiv_eval_final_point() which cas easily evaluate derivatives.
79  * Would be nice to have dispalcement evaluation function which does not require
80  * knowing derivatives ahead of a time.
81  */
82 void BKE_subdiv_eval_displacement(
83         struct Subdiv *subdiv,
84         const int ptex_face_index,
85         const float u, const float v,
86         const float dPdu[3], const float dPdv[3],
87         float r_D[3]);
88
89 void BKE_subdiv_eval_final_point(
90         struct Subdiv *subdiv,
91         const int ptex_face_index,
92         const float u, const float v,
93         float r_P[3]);
94
95 /* Patch queries at given resolution.
96  *
97  * Will evaluate patch at uniformly distributed (u, v) coordinates on a grid
98  * of given resolution, producing resolution^2 evaluation points. The order
99  * goes as u in rows, v in columns.
100  */
101
102 void BKE_subdiv_eval_limit_patch_resolution_point(
103         struct Subdiv *subdiv,
104         const int ptex_face_index,
105         const int resolution,
106         void *buffer, const int offset, const int stride);
107 void BKE_subdiv_eval_limit_patch_resolution_point_and_derivatives(
108         struct Subdiv *subdiv,
109         const int ptex_face_index,
110         const int resolution,
111         void *point_buffer, const int point_offset, const int point_stride,
112         void *du_buffer, const int du_offset, const int du_stride,
113         void *dv_buffer, const int dv_offset, const int dv_stride);
114 void BKE_subdiv_eval_limit_patch_resolution_point_and_normal(
115         struct Subdiv *subdiv,
116         const int ptex_face_index,
117         const int resolution,
118         void *point_buffer, const int point_offset, const int point_stride,
119         void *normal_buffer, const int normal_offset, const int normal_stride);
120 void BKE_subdiv_eval_limit_patch_resolution_point_and_short_normal(
121         struct Subdiv *subdiv,
122         const int ptex_face_index,
123         const int resolution,
124         void *point_buffer, const int point_offset, const int point_stride,
125         void *normal_buffer, const int normal_offset, const int normal_stride);
126
127 #endif  /* __BKE_SUBDIV_EVAL_H__ */