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