Outliner: Simplify logic for parent nesting
[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,
39                          const int num_vertices);
40   // Set face varying data from a continuous array of data.
41   //
42   // TODO(sergey): Find a better name for vertex here. It is not the vertex of
43   // geometry, but a vertex of UV map.
44   void (*setFaceVaryingData)(struct OpenSubdiv_Evaluator *evaluator,
45                              const int face_varying_channel,
46                              const float *face_varying_data,
47                              const int start_vertex_index,
48                              const int num_vertices);
49
50   // Set coarse vertex position from a continuous memory buffer where
51   // first coordinate starts at offset of `start_offset` and there is `stride`
52   // bytes between adjacent vertex coordinates.
53   void (*setCoarsePositionsFromBuffer)(struct OpenSubdiv_Evaluator *evaluator,
54                                        const void *buffer,
55                                        const int start_offset,
56                                        const int stride,
57                                        const int start_vertex_index,
58                                        const int num_vertices);
59   // Set varying data from a continuous memory buffer where
60   // first coordinate starts at offset of `start_offset` and there is `stride`
61   // bytes between adjacent vertex coordinates.
62   void (*setVaryingDataFromBuffer)(struct OpenSubdiv_Evaluator *evaluator,
63                                    const void *buffer,
64                                    const int start_offset,
65                                    const int stride,
66                                    const int start_vertex_index,
67                                    const int num_vertices);
68   // Set face varying data from a continuous memory buffer where
69   // first coordinate starts at offset of `start_offset` and there is `stride`
70   // bytes between adjacent vertex coordinates.
71   //
72   // TODO(sergey): Find a better name for vertex here. It is not the vertex of
73   // geometry, but a vertex of UV map.
74   void (*setFaceVaryingDataFromBuffer)(struct OpenSubdiv_Evaluator *evaluator,
75                                        const int face_varying_channel,
76                                        const void *buffer,
77                                        const int start_offset,
78                                        const int stride,
79                                        const int start_vertex_index,
80                                        const int num_vertices);
81
82   // Refine after coarse positions update.
83   void (*refine)(struct OpenSubdiv_Evaluator *evaluator);
84
85   // Evaluate given ptex face at given bilinear coordinate.
86   // If derivatives are NULL, they will not be evaluated.
87   void (*evaluateLimit)(struct OpenSubdiv_Evaluator *evaluator,
88                         const int ptex_face_index,
89                         float face_u,
90                         float face_v,
91                         float P[3],
92                         float dPdu[3],
93                         float dPdv[3]);
94
95   // Evaluate varying data at a given bilinear coordinate of given ptex face.
96   void (*evaluateVarying)(struct OpenSubdiv_Evaluator *evaluator,
97                           const int ptex_face_index,
98                           float face_u,
99                           float face_v,
100                           float varying[3]);
101
102   // Evaluate face-varying data at a given bilinear coordinate of given
103   // ptex face.
104   void (*evaluateFaceVarying)(struct OpenSubdiv_Evaluator *evaluator,
105                               const int face_varying_channel,
106                               const int ptex_face_index,
107                               float face_u,
108                               float face_v,
109                               float face_varying[2]);
110
111   // Internal storage for the use in this module only.
112   //
113   // This is where actual OpenSubdiv's evaluator is living.
114   struct OpenSubdiv_EvaluatorInternal *internal;
115 } OpenSubdiv_Evaluator;
116
117 OpenSubdiv_Evaluator *openSubdiv_createEvaluatorFromTopologyRefiner(
118     struct OpenSubdiv_TopologyRefiner *topology_refiner);
119
120 void openSubdiv_deleteEvaluator(OpenSubdiv_Evaluator *evaluator);
121
122 #ifdef __cplusplus
123 }
124 #endif
125
126 #endif  // OPENSUBDIV_EVALUATOR_CAPI_H_