Blender V4.5
BKE_subdiv_eval.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2018 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
12#include "BLI_span.hh"
13
14struct Mesh;
17
18namespace blender::bke::subdiv {
19
20struct Subdiv;
21
26
27/* Returns true if evaluator is ready for use. */
28bool eval_begin(Subdiv *subdiv,
29 eSubdivEvaluatorType evaluator_type,
30 OpenSubdiv_EvaluatorCache *evaluator_cache,
31 const OpenSubdiv_EvaluatorSettings *settings);
32
33/* coarse_vertex_cos is an optional argument which allows to override coordinates of the coarse
34 * mesh. */
35bool eval_begin_from_mesh(Subdiv *subdiv,
36 const Mesh *mesh,
37 Span<float3> coarse_vert_positions,
38 eSubdivEvaluatorType evaluator_type,
39 OpenSubdiv_EvaluatorCache *evaluator_cache);
40bool eval_refine_from_mesh(Subdiv *subdiv, const Mesh *mesh, Span<float3> coarse_vert_positions);
41
42/* Makes sure displacement evaluator is initialized.
43 *
44 * NOTE: This function must be called once before evaluating displacement or
45 * final surface position. */
46void eval_init_displacement(Subdiv *subdiv);
47
48/* Single point queries. */
49
50/* Evaluate point at a limit surface, with optional derivatives and normal. */
51
52void eval_limit_point(Subdiv *subdiv, int ptex_face_index, float u, float v, float r_P[3]);
54 int ptex_face_index,
55 float u,
56 float v,
57 float r_P[3],
58 float r_dPdu[3],
59 float r_dPdv[3]);
61 Subdiv *subdiv, int ptex_face_index, float u, float v, float r_P[3], float r_N[3]);
62
63/* Evaluate smoothly interpolated vertex data (such as ORCO). */
64void eval_vertex_data(Subdiv *subdiv,
65 const int ptex_face_index,
66 const float u,
67 const float v,
68 float r_vertex_data[]);
69
70/* Evaluate face-varying layer (such as UV). */
71void eval_face_varying(Subdiv *subdiv,
72 int face_varying_channel,
73 int ptex_face_index,
74 float u,
75 float v,
76 float r_face_varying[2]);
77
78/* NOTE: Expects derivatives to be correct.
79 *
80 * TODO(sergey): This is currently used together with
81 * eval_final_point() which can easily evaluate derivatives.
82 * Would be nice to have displacement evaluation function which does not require
83 * knowing derivatives ahead of a time. */
84void eval_displacement(Subdiv *subdiv,
85 int ptex_face_index,
86 float u,
87 float v,
88 const float dPdu[3],
89 const float dPdv[3],
90 float r_D[3]);
91
92/* Evaluate point on a limit surface with displacement applied to it. */
93void eval_final_point(Subdiv *subdiv, int ptex_face_index, float u, float v, float r_P[3]);
94
95} // namespace blender::bke::subdiv
ATTR_WARN_UNUSED_RESULT const BMVert * v
void eval_init_displacement(Subdiv *subdiv)
void eval_vertex_data(Subdiv *subdiv, const int ptex_face_index, const float u, const float v, float r_vertex_data[])
bool eval_begin_from_mesh(Subdiv *subdiv, const Mesh *mesh, Span< float3 > coarse_vert_positions, eSubdivEvaluatorType evaluator_type, OpenSubdiv_EvaluatorCache *evaluator_cache)
void eval_limit_point(Subdiv *subdiv, int ptex_face_index, float u, float v, float r_P[3])
void eval_displacement(Subdiv *subdiv, int ptex_face_index, float u, float v, const float dPdu[3], const float dPdv[3], float r_D[3])
void eval_limit_point_and_derivatives(Subdiv *subdiv, int ptex_face_index, float u, float v, float r_P[3], float r_dPdu[3], float r_dPdv[3])
void eval_limit_point_and_normal(Subdiv *subdiv, int ptex_face_index, float u, float v, float r_P[3], float r_N[3])
bool eval_begin(Subdiv *subdiv, eSubdivEvaluatorType evaluator_type, OpenSubdiv_EvaluatorCache *evaluator_cache, const OpenSubdiv_EvaluatorSettings *settings)
void eval_face_varying(Subdiv *subdiv, int face_varying_channel, int ptex_face_index, float u, float v, float r_face_varying[2])
bool eval_refine_from_mesh(Subdiv *subdiv, const Mesh *mesh, Span< float3 > coarse_vert_positions)
void eval_final_point(Subdiv *subdiv, int ptex_face_index, float u, float v, float r_P[3])