Merge branch 'master' into soc-2018-npr
[blender.git] / intern / opensubdiv / opensubdiv_evaluator_capi.h
1 // Copyright 2013 Blender Foundation. All rights reserved.
2 //
3 // This program is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU General Public License
5 // as published by the Free Software Foundation; either version 2
6 // of the License, or (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software Foundation,
15 // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 //
17 // Author: Sergey Sharybin
18
19 #ifndef OPENSUBDIV_EVALUATOR_CAPI_H_
20 #define OPENSUBDIV_EVALUATOR_CAPI_H_
21
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25
26 struct OpenSubdiv_EvaluatorInternal;
27 struct OpenSubdiv_TopologyRefiner;
28
29 typedef struct OpenSubdiv_Evaluator {
30   // Set coarse positions from a continuous array of coordinates.
31   void (*setCoarsePositions)(struct OpenSubdiv_Evaluator* evaluator,
32                              const float* positions,
33                              const int start_vertex_index,
34                              const int num_vertices);
35   // Set varying data from a continuous array of data.
36   void (*setVaryingData)(struct OpenSubdiv_Evaluator* evaluator,
37                          const float* varying_data,
38                          const int start_vertex_index, const int num_vertices);
39   // Set face varying data from a continuous array of data.
40   //
41   // TODO(sergey): Find a better name for vertex here. It is not the vertex of
42   // geometry, but a vertex of UV map.
43   void (*setFaceVaryingData)(struct OpenSubdiv_Evaluator* evaluator,
44                              const int face_varying_channel,
45                              const float* face_varying_data,
46                              const int start_vertex_index,
47                              const int num_vertices);
48
49   // Set coarse vertex position from a continuous memory buffer where
50   // first coordinate starts at offset of `start_offset` and there is `stride`
51   // bytes between adjacent vertex coordinates.
52   void (*setCoarsePositionsFromBuffer)(struct OpenSubdiv_Evaluator* evaluator,
53                                        const void* buffer,
54                                        const int start_offset,
55                                        const int stride,
56                                        const int start_vertex_index,
57                                        const int num_vertices);
58   // Set varying data from a continuous memory buffer where
59   // first coordinate starts at offset of `start_offset` and there is `stride`
60   // bytes between adjacent vertex coordinates.
61   void (*setVaryingDataFromBuffer)(struct OpenSubdiv_Evaluator* evaluator,
62                                    const void* buffer,
63                                    const int start_offset,
64                                    const int stride,
65                                    const int start_vertex_index,
66                                    const int num_vertices);
67   // Set face varying data from a continuous memory buffer where
68   // first coordinate starts at offset of `start_offset` and there is `stride`
69   // bytes between adjacent vertex coordinates.
70   //
71   // TODO(sergey): Find a better name for vertex here. It is not the vertex of
72   // geometry, but a vertex of UV map.
73   void (*setFaceVaryingDataFromBuffer)(struct OpenSubdiv_Evaluator* evaluator,
74                                        const int face_varying_channel,
75                                        const void* buffer,
76                                        const int start_offset,
77                                        const int stride,
78                                        const int start_vertex_index,
79                                        const int num_vertices);
80
81   // Refine after coarse positions update.
82   void (*refine)(struct OpenSubdiv_Evaluator* evaluator);
83
84   // Evaluate given ptex face at given bilinear coordinate.
85   // If derivatives are NULL, they will not be evaluated.
86   void (*evaluateLimit)(struct OpenSubdiv_Evaluator* evaluator,
87                         const int ptex_face_index,
88                         float face_u, float face_v,
89                         float P[3], float dPdu[3], float dPdv[3]);
90
91   void (*evaluateLimit2)(struct OpenSubdiv_Evaluator* evaluator,
92                         const int ptex_face_index,
93                         float face_u, float face_v,
94                                                 float P[3],
95                                                 float dPdu[3],
96                                                 float dPdv[3],
97                                                 float dPduu[3],
98                                                 float dPduv[3],
99                                                 float dPdvv[3]);
100
101   // Evaluate varying data at a given bilinear coordinate of given ptex face.
102   void (*evaluateVarying)(struct OpenSubdiv_Evaluator* evaluator,
103                           const int ptex_face_index,
104                           float face_u, float face_v,
105                           float varying[3]);
106
107   // Evaluate face-varying data at a given bilinear coordinate of given
108   // ptex face.
109   void (*evaluateFaceVarying)(struct OpenSubdiv_Evaluator* evaluator,
110                               const int face_varying_channel,
111                               const int ptex_face_index,
112                               float face_u, float face_v,
113                               float face_varying[2]);
114
115   // Internal storage for the use in this module only.
116   //
117   // This is where actual OpenSubdiv's evaluator is living.
118   struct OpenSubdiv_EvaluatorInternal* internal;
119 } OpenSubdiv_Evaluator;
120
121 OpenSubdiv_Evaluator* openSubdiv_createEvaluatorFromTopologyRefiner(
122     struct OpenSubdiv_TopologyRefiner* topology_refiner);
123
124 void openSubdiv_deleteEvaluator(OpenSubdiv_Evaluator* evaluator);
125
126 #ifdef __cplusplus
127 }
128 #endif
129
130 #endif  // OPENSUBDIV_EVALUATOR_CAPI_H_