diff options
Diffstat (limited to 'intern/opensubdiv/opensubdiv_evaluator_capi.h')
-rw-r--r-- | intern/opensubdiv/opensubdiv_evaluator_capi.h | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/intern/opensubdiv/opensubdiv_evaluator_capi.h b/intern/opensubdiv/opensubdiv_evaluator_capi.h new file mode 100644 index 00000000000..eda5d614635 --- /dev/null +++ b/intern/opensubdiv/opensubdiv_evaluator_capi.h @@ -0,0 +1,120 @@ +// Copyright 2013 Blender Foundation. All rights reserved. +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// Author: Sergey Sharybin + +#ifndef OPENSUBDIV_EVALUATOR_CAPI_H_ +#define OPENSUBDIV_EVALUATOR_CAPI_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +struct OpenSubdiv_EvaluatorInternal; +struct OpenSubdiv_TopologyRefiner; + +typedef struct OpenSubdiv_Evaluator { + // Set coarse positions from a continuous array of coordinates. + void (*setCoarsePositions)(struct OpenSubdiv_Evaluator* evaluator, + const float* positions, + const int start_vertex_index, + const int num_vertices); + // Set varying data from a continuous array of data. + void (*setVaryingData)(struct OpenSubdiv_Evaluator* evaluator, + const float* varying_data, + const int start_vertex_index, const int num_vertices); + // Set face varying data from a continuous array of data. + // + // TODO(sergey): Find a better name for vertex here. It is not the vertex of + // geometry, but a vertex of UV map. + void (*setFaceVaryingData)(struct OpenSubdiv_Evaluator* evaluator, + const int face_varying_channel, + const float* face_varying_data, + const int start_vertex_index, + const int num_vertices); + + // Set coarse vertex position from a continuous memory buffer where + // first coordinate starts at offset of `start_offset` and there is `stride` + // bytes between adjacent vertex coordinates. + void (*setCoarsePositionsFromBuffer)(struct OpenSubdiv_Evaluator* evaluator, + const void* buffer, + const int start_offset, + const int stride, + const int start_vertex_index, + const int num_vertices); + // Set varying data from a continuous memory buffer where + // first coordinate starts at offset of `start_offset` and there is `stride` + // bytes between adjacent vertex coordinates. + void (*setVaryingDataFromBuffer)(struct OpenSubdiv_Evaluator* evaluator, + const void* buffer, + const int start_offset, + const int stride, + const int start_vertex_index, + const int num_vertices); + // Set face varying data from a continuous memory buffer where + // first coordinate starts at offset of `start_offset` and there is `stride` + // bytes between adjacent vertex coordinates. + // + // TODO(sergey): Find a better name for vertex here. It is not the vertex of + // geometry, but a vertex of UV map. + void (*setFaceVaryingDataFromBuffer)(struct OpenSubdiv_Evaluator* evaluator, + const int face_varying_channel, + const void* buffer, + const int start_offset, + const int stride, + const int start_vertex_index, + const int num_vertices); + + // Refine after coarse positions update. + void (*refine)(struct OpenSubdiv_Evaluator* evaluator); + + // Evaluate given ptex face at given bilinear coordinate. + // If derivatives are NULL, they will not be evaluated. + void (*evaluateLimit)(struct OpenSubdiv_Evaluator* evaluator, + const int ptex_face_index, + float face_u, float face_v, + float P[3], float dPdu[3], float dPdv[3]); + + // Evaluate varying data at a given bilinear coordinate of given ptex face. + void (*evaluateVarying)(struct OpenSubdiv_Evaluator* evaluator, + const int ptex_face_index, + float face_u, float face_v, + float varying[3]); + + // Evaluate face-varying data at a given bilinear coordinate of given + // ptex face. + void (*evaluateFaceVarying)(struct OpenSubdiv_Evaluator* evaluator, + const int face_varying_channel, + const int ptex_face_index, + float face_u, float face_v, + float face_varying[2]); + + // Internal storage for the use in this module only. + // + // This is where actual OpenSubdiv's evaluator is living. + struct OpenSubdiv_EvaluatorInternal* internal; +} OpenSubdiv_Evaluator; + +OpenSubdiv_Evaluator* openSubdiv_createEvaluatorFromTopologyRefiner( + struct OpenSubdiv_TopologyRefiner* topology_refiner); + +void openSubdiv_deleteEvaluator(OpenSubdiv_Evaluator* evaluator); + +#ifdef __cplusplus +} +#endif + +#endif // OPENSUBDIV_EVALUATOR_CAPI_H_ |