Blender V5.0
blender::bke::subdiv Namespace Reference

Classes

struct  Settings
struct  SubdivStats
struct  Displacement
struct  Subdiv
struct  ForeachContext
struct  ToMeshSettings
struct  ConverterStorage
struct  SubdivDeformContext
struct  PolyCornerIndex
struct  MultiresDisplacementData
struct  ForeachTaskContext
struct  SubdivMeshContext
struct  LoopsOfPtex
struct  VerticesForInterpolation
struct  LoopsForInterpolation
struct  SubdivMeshTLS

Typedefs

using ForeachTopologyInformationCb
using ForeachVertexFromCornerCb
using ForeachVertexFromEdgeCb
using ForeachVertexInnerCb
using ForeachEdgeCb
using ForeachLoopCb
using ForeachPolygonCb
using ForeachLooseCb
using ForeachVertexOfLooseEdgeCb

Enumerations

enum  VtxBoundaryInterpolation { SUBDIV_VTX_BOUNDARY_NONE , SUBDIV_VTX_BOUNDARY_EDGE_ONLY , SUBDIV_VTX_BOUNDARY_EDGE_AND_CORNER }
enum  FVarLinearInterpolation {
  SUBDIV_FVAR_LINEAR_INTERPOLATION_NONE , SUBDIV_FVAR_LINEAR_INTERPOLATION_CORNERS_ONLY , SUBDIV_FVAR_LINEAR_INTERPOLATION_CORNERS_AND_JUNCTIONS , SUBDIV_FVAR_LINEAR_INTERPOLATION_CORNERS_JUNCTIONS_AND_CONCAVE ,
  SUBDIV_FVAR_LINEAR_INTERPOLATION_BOUNDARIES , SUBDIV_FVAR_LINEAR_INTERPOLATION_ALL
}
enum  StatsValue {
  SUBDIV_STATS_TOPOLOGY_REFINER_CREATION_TIME = 0 , SUBDIV_STATS_SUBDIV_TO_MESH , SUBDIV_STATS_SUBDIV_TO_MESH_GEOMETRY , SUBDIV_STATS_EVALUATOR_CREATE ,
  SUBDIV_STATS_EVALUATOR_REFINE , SUBDIV_STATS_SUBDIV_TO_CCG , SUBDIV_STATS_SUBDIV_TO_CCG_ELEMENTS , SUBDIV_STATS_TOPOLOGY_COMPARE ,
  NUM_SUBDIV_STATS_VALUES
}
enum  eSubdivEvaluatorType { SUBDIV_EVALUATOR_TYPE_CPU , SUBDIV_EVALUATOR_TYPE_GPU }
enum class  AverageWith : int8_t { None , All , Prev , Next }

Functions

bool eval_begin (Subdiv *subdiv, eSubdivEvaluatorType evaluator_type, OpenSubdiv_EvaluatorCache *evaluator_cache, const OpenSubdiv_EvaluatorSettings *settings)
bool eval_begin_from_mesh (Subdiv *subdiv, const Mesh *mesh, eSubdivEvaluatorType evaluator_type, Span< float3 > coarse_vert_positions={}, OpenSubdiv_EvaluatorCache *evaluator_cache=nullptr)
bool eval_refine_from_mesh (Subdiv *subdiv, const Mesh *mesh, Span< float3 > coarse_vert_positions)
void eval_init_displacement (Subdiv *subdiv)
float3 eval_limit_point (Subdiv *subdiv, int ptex_face_index, float u, float v)
void eval_limit_point_and_derivatives (Subdiv *subdiv, int ptex_face_index, float u, float v, float3 &r_P, float3 &r_dPdu, float3 &r_dPdv)
void eval_limit_point_and_normal (Subdiv *subdiv, int ptex_face_index, float u, float v, float3 &r_P, float3 &r_N)
void eval_vertex_data (Subdiv *subdiv, int ptex_face_index, float u, float v, float r_vertex_data[])
void eval_face_varying (Subdiv *subdiv, int face_varying_channel, int ptex_face_index, float u, float v, float2 &r_face_varying)
void eval_displacement (Subdiv *subdiv, int ptex_face_index, float u, float v, const float3 &dPdu, const float3 &dPdv, float3 &r_D)
float3 eval_final_point (Subdiv *subdiv, int ptex_face_index, float u, float v)
int topology_num_fvar_layers_get (const Subdiv *subdiv)
void converter_free (OpenSubdiv_Converter *converter)
int converter_vtx_boundary_interpolation_from_settings (const Settings *settings)
int converter_fvar_linear_from_settings (const Settings *settings)
void converter_init_for_mesh (OpenSubdiv_Converter *converter, const Settings *settings, const Mesh *mesh)
static OpenSubdiv_SchemeType get_scheme_type (const OpenSubdiv_Converter *converter)
static OpenSubdiv_VtxBoundaryInterpolation get_vtx_boundary_interpolation (const OpenSubdiv_Converter *converter)
static OpenSubdiv_FVarLinearInterpolation get_fvar_linear_interpolation (const OpenSubdiv_Converter *converter)
static bool specifies_full_topology (const OpenSubdiv_Converter *)
static int get_num_edges (const OpenSubdiv_Converter *converter)
static int get_num_vertices (const OpenSubdiv_Converter *converter)
static void get_face_vertices (const OpenSubdiv_Converter *converter, int manifold_face_index, int *manifold_face_vertices)
static void get_edge_vertices (const OpenSubdiv_Converter *converter, int manifold_edge_index, int *manifold_edge_vertices)
static float get_edge_sharpness (const OpenSubdiv_Converter *converter, int manifold_edge_index)
static bool is_infinite_sharp_vertex (const OpenSubdiv_Converter *converter, int manifold_vertex_index)
static float get_vertex_sharpness (const OpenSubdiv_Converter *converter, int manifold_vertex_index)
static int get_num_uv_layers (const OpenSubdiv_Converter *converter)
static void precalc_uv_layer (const OpenSubdiv_Converter *converter, const int layer_index)
static void finish_uv_layer (const OpenSubdiv_Converter *)
static int get_num_uvs (const OpenSubdiv_Converter *converter)
static int get_face_corner_uv_index (const OpenSubdiv_Converter *converter, const int face_index, const int corner)
static void free_user_data (const OpenSubdiv_Converter *converter)
static void init_functions (OpenSubdiv_Converter *converter)
static void initialize_manifold_index_array (const BitSpan not_used_map, const int num_elements, int **r_indices, int **r_indices_reverse, int *r_num_manifold_elements)
static void initialize_manifold_indices (ConverterStorage *storage)
static void init_user_data (OpenSubdiv_Converter *converter, const Settings *settings, const Mesh *mesh)
static int displacement_get_grid_and_coord (const Displacement &displacement, const int ptex_face_index, const float u, const float v, const MDisps **r_displacement_grid, float &r_grid_u, float &r_grid_v)
static const MDispsdisplacement_get_other_grid (const Displacement &displacement, const int ptex_face_index, const int corner, const int corner_delta)
BLI_INLINE AverageWith read_displacement_grid (const MDisps &displacement_grid, const int grid_size, const float grid_u, const float grid_v, float3 &r_tangent_D)
static void average_convert_grid_coord_to_ptex (const int num_corners, const int corner, const float grid_u, const float grid_v, float &r_ptex_face_u, float &r_ptex_face_v)
static void average_construct_tangent_matrix (Subdiv &subdiv, const int num_corners, const int ptex_face_index, const int corner, const float u, const float v, float3x3 &r_tangent_matrix)
static void average_read_displacement_tangent (const MultiresDisplacementData &data, const MDisps &other_displacement_grid, const float grid_u, const float grid_v, float3 &r_tangent_D)
static void average_read_displacement_object (const MultiresDisplacementData &data, const MDisps &displacement_grid, const float grid_u, const float grid_v, const int ptex_face_index, const int corner_index, float3 &r_D)
static void average_get_other_ptex_and_corner (const MultiresDisplacementData &data, const int ptex_face_index, const int corner, const int corner_delta, int &r_other_ptex_face_index, int &r_other_corner_index)
static void average_with_other (const Displacement &displacement, const int ptex_face_index, const int corner, const float grid_u, const float grid_v, const int corner_delta, float3 &r_D)
static void average_with_all (const Displacement &displacement, const int ptex_face_index, const int corner, const float, const float, float3 &r_D)
static void average_with_next (const Displacement &displacement, const int ptex_face_index, const int corner, const float grid_u, const float, float3 &r_D)
static void average_with_prev (const Displacement &displacement, const int ptex_face_index, const int corner, const float, const float grid_v, float3 &r_D)
static void average_displacement (const Displacement &displacement, const AverageWith average_with, const int ptex_face_index, const int corner, const float grid_u, const float grid_v, float3 &r_D)
static int displacement_get_face_corner (const MultiresDisplacementData &data, const int ptex_face_index, const float u, const float v)
static void initialize (Displacement *displacement)
static void eval_displacement (Displacement *displacement, const int ptex_face_index, const float u, const float v, const float3 &dPdu, const float3 &dPdv, float3 &r_D)
static void free_displacement (Displacement *displacement)
static int count_num_ptex_faces (const Mesh &mesh)
static void displacement_data_init_mapping (Displacement &displacement, const Mesh &mesh)
static void displacement_init_data (Displacement &displacement, Subdiv &subdiv, const Mesh &mesh, const MultiresModifierData &mmd)
static void displacement_init_functions (Displacement *displacement)
Module
void init ()
void exit ()
Conversion helpers.
FVarLinearInterpolation fvar_interpolation_from_uv_smooth (int uv_smooth)
VtxBoundaryInterpolation vtx_boundary_interpolation_from_subsurf (int boundary_smooth)
Statistics
void stats_init (SubdivStats *stats)
void stats_begin (SubdivStats *stats, StatsValue value)
void stats_end (SubdivStats *stats, StatsValue value)
void stats_reset (SubdivStats *stats, StatsValue value)
void stats_print (const SubdivStats *stats)
Settings
bool settings_equal (const Settings *settings_a, const Settings *settings_b)
Construction
Subdivnew_from_converter (const Settings *settings, OpenSubdiv_Converter *converter)
Subdivnew_from_mesh (const Settings *settings, const Mesh *mesh)
Subdivupdate_from_converter (Subdiv *subdiv, const Settings *settings, OpenSubdiv_Converter *converter)
Subdivupdate_from_mesh (Subdiv *subdiv, const Settings *settings, const Mesh *mesh)
void free (Subdiv *subdiv)
Displacement API
void displacement_attach_from_multires (Subdiv *subdiv, const Mesh *mesh, const MultiresModifierData *mmd)
void displacement_detach (Subdiv *subdiv)
Topology helpers
Span< int > face_ptex_offset_get (Subdiv *subdiv)
PTex faces and grids
BLI_INLINE void ptex_face_uv_to_grid_uv (float ptex_u, float ptex_v, float *r_grid_u, float *r_grid_v)
BLI_INLINE float2 ptex_face_uv_to_grid_uv (const float2 &ptex_uv)
BLI_INLINE void grid_uv_to_ptex_face_uv (float grid_u, float grid_v, float *r_ptex_u, float *r_ptex_v)
BLI_INLINE int grid_size_from_level (int level)
BLI_INLINE int rotate_quad_to_corner (float quad_u, float quad_v, float *r_corner_u, float *r_corner_v)
BLI_INLINE float2 rotate_quad_to_corner (int corner, const float2 &quad)
BLI_INLINE void rotate_grid_to_quad (int corner, float grid_u, float grid_v, float *r_quad_u, float *r_quad_v)
BLI_INLINE float crease_to_sharpness (float crease)
BLI_INLINE float sharpness_to_crease (float sharpness)
Public entry point
void deform_coarse_vertices (Subdiv *subdiv, const Mesh *coarse_mesh, MutableSpan< float3 > vert_positions)
Meshsubdiv_to_mesh (Subdiv *subdiv, const ToMeshSettings *settings, const Mesh *coarse_mesh)
Subdivision process entry points
bool foreach_subdiv_geometry (Subdiv *subdiv, const ForeachContext *context, const ToMeshSettings *mesh_settings, const Mesh *coarse_mesh)
static void subdiv_foreach_single_geometry_vertices (ForeachTaskContext *ctx, void *tls)
static void subdiv_foreach_mark_non_loose_geometry (ForeachTaskContext *ctx)
static void subdiv_foreach_single_thread_tasks (ForeachTaskContext *ctx)
static void subdiv_foreach_task (void *__restrict userdata, const int face_index, const TaskParallelTLS *__restrict tls)
static void subdiv_foreach_boundary_edges_task (void *__restrict userdata, const int edge_index, const TaskParallelTLS *__restrict tls)
static void subdiv_foreach_free (const void *__restrict userdata, void *__restrict userdata_chunk)
Loose elements subdivision process
float3 mesh_interpolate_position_on_edge (Span< float3 > coarse_positions, Span< int2 > coarse_edges, GroupedSpan< int > vert_to_edge_map, int coarse_edge_index, bool is_simple, float u)
static void subdiv_mesh_vertex_loose (const ForeachContext *foreach_context, void *, const int coarse_vertex_index, const int subdiv_vertex_index)
static std::array< std::optional< int2 >, 2 > find_edge_neighbors (const Span< int2 > coarse_edges, const GroupedSpan< int > vert_to_edge_map, const int edge_index)
static std::array< float3, 4 > find_loose_edge_interpolation_positions (const Span< float3 > coarse_positions, const int2 &coarse_edge, const std::array< std::optional< int2 >, 2 > &neighbors)
static void subdiv_mesh_vertex_of_loose_edge_interpolate (SubdivMeshContext *ctx, const int2 &coarse_edge, const float u, const int subdiv_vertex_index)
static void subdiv_mesh_vertex_of_loose_edge (const ForeachContext *foreach_context, void *, const int coarse_edge_index, const float u, const int subdiv_vertex_index)
Limit surface
void calculate_limit_positions (Mesh *mesh, MutableSpan< float3 > limit_positions)
Subdivision context
static void subdiv_mesh_prepare_accumulator (SubdivDeformContext *ctx, int num_vertices)
static void subdiv_mesh_context_free (SubdivDeformContext *ctx)
static void subdiv_mesh_ctx_cache_uv_layers (SubdivMeshContext *ctx)
static void subdiv_mesh_ctx_cache_custom_data_layers (SubdivMeshContext *ctx)
static void subdiv_mesh_prepare_accumulator (SubdivMeshContext *ctx, int num_vertices)
static void subdiv_mesh_context_free (SubdivMeshContext *ctx)
Accumulation helpers
static void subdiv_accumulate_vertex_displacement (SubdivDeformContext *ctx, const int ptex_face_index, const float u, const float v, int vertex_index)
static void subdiv_accumulate_vertex_displacement (SubdivMeshContext *ctx, const int ptex_face_index, const float u, const float v, const int subdiv_vertex_index)
Subdivision callbacks
static bool subdiv_mesh_topology_info (const ForeachContext *foreach_context, const int, const int, const int, const int, const int *)
static void subdiv_mesh_vertex_every_corner (const ForeachContext *foreach_context, void *, const int ptex_face_index, const float u, const float v, const int coarse_vertex_index, const int, const int, const int)
static void subdiv_mesh_vertex_corner (const ForeachContext *foreach_context, void *, const int ptex_face_index, const float u, const float v, const int coarse_vertex_index, const int, const int, const int)
Initialization
static void setup_foreach_callbacks (const SubdivDeformContext *subdiv_context, ForeachContext *foreach_context)
static void subdiv_foreach_ctx_count (ForeachTaskContext *ctx)
static void subdiv_foreach_ctx_init_offsets (ForeachTaskContext *ctx)
static void subdiv_foreach_ctx_init (Subdiv *subdiv, ForeachTaskContext *ctx)
static void subdiv_foreach_ctx_free (ForeachTaskContext *ctx)
static void setup_foreach_callbacks (const SubdivMeshContext *subdiv_context, ForeachContext *foreach_context)
General helpers
BLI_INLINE int num_ptex_faces_per_face_get (const IndexRange face)
BLI_INLINE int num_edges_per_ptex_face_get (const int resolution)
BLI_INLINE int num_inner_edges_per_ptex_face_get (const int resolution)
BLI_INLINE int num_faces_per_ptex_get (const int resolution)
BLI_INLINE int ptex_face_resolution_get (const IndexRange face, int resolution)
Threading helpers
static void * subdiv_foreach_tls_alloc (ForeachTaskContext *ctx)
static void subdiv_foreach_tls_free (ForeachTaskContext *ctx, void *tls)
Vertex traversal process
static void subdiv_foreach_corner_vertices_regular_do (ForeachTaskContext *ctx, void *tls, const int coarse_face_index, ForeachVertexFromCornerCb vertex_corner, bool check_usage)
static void subdiv_foreach_corner_vertices_regular (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_corner_vertices_special_do (ForeachTaskContext *ctx, void *tls, const int coarse_face_index, ForeachVertexFromCornerCb vertex_corner, bool check_usage)
static void subdiv_foreach_corner_vertices_special (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_corner_vertices (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_every_corner_vertices_regular (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_every_corner_vertices_special (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_every_corner_vertices (ForeachTaskContext *ctx, void *tls)
static void subdiv_foreach_edge_vertices_regular_do (ForeachTaskContext *ctx, void *tls, const int coarse_face_index, ForeachVertexFromEdgeCb vertex_edge, bool check_usage)
static void subdiv_foreach_edge_vertices_regular (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_edge_vertices_special_do (ForeachTaskContext *ctx, void *tls, const int coarse_face_index, ForeachVertexFromEdgeCb vertex_edge, bool check_usage)
static void subdiv_foreach_edge_vertices_special (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_edge_vertices (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_every_edge_vertices_regular (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_every_edge_vertices_special (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_every_edge_vertices (ForeachTaskContext *ctx, void *tls)
static void subdiv_foreach_inner_vertices_regular (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_inner_vertices_special (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_inner_vertices (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_vertices (ForeachTaskContext *ctx, void *tls, const int face_index)
Edge traversal process
static int subdiv_foreach_edges_row (ForeachTaskContext *ctx, void *tls, const int coarse_edge_index, const int start_subdiv_edge_index, const int start_vertex_index, const int num_edges_per_row)
static int subdiv_foreach_edges_column (ForeachTaskContext *ctx, void *tls, const int coarse_start_edge_index, const int coarse_end_edge_index, const int start_subdiv_edge_index, const int start_vertex_index, const int num_edges_per_row)
static void subdiv_foreach_edges_all_patches_regular (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_edges_all_patches_special (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_edges_all_patches (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_edges (ForeachTaskContext *ctx, void *tls, int face_index)
static void subdiv_foreach_boundary_edges (ForeachTaskContext *ctx, void *tls, int coarse_edge_index)
Loops traversal
static void rotate_indices (const int rot, int *a, int *b, int *c, int *d)
static void subdiv_foreach_loops_of_face (ForeachTaskContext *ctx, void *tls, int subdiv_loop_start_index, const int ptex_face_index, const int coarse_face_index, const int coarse_corner_index, const int rotation, int v0, int e0, int v1, int e1, int v2, int e2, int v3, int e3, const float u, const float v, const float du, const float dv)
static int subdiv_foreach_loops_corner_index (const float u, const float v, const float du, const float dv)
static void subdiv_foreach_loops_regular (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_loops_special (ForeachTaskContext *ctx, void *tls, const int coarse_face_index)
static void subdiv_foreach_loops (ForeachTaskContext *ctx, void *tls, int face_index)
Polygons traverse process
static void subdiv_foreach_faces (ForeachTaskContext *ctx, void *tls, int face_index)
Loose elements traverse process
static void subdiv_foreach_loose_vertices_task (void *__restrict userdata, const int coarse_vertex_index, const TaskParallelTLS *__restrict tls)
static void subdiv_foreach_vertices_of_loose_edges_task (void *__restrict userdata, const int coarse_edge_index, const TaskParallelTLS *__restrict tls)
Loop custom data copy helpers
static void loops_of_ptex_get (LoopsOfPtex *loops_of_ptex, const IndexRange coarse_face, const int ptex_of_face_index)
Vertex custom data interpolation helpers
static void vertex_interpolation_init (const SubdivMeshContext *ctx, VerticesForInterpolation *vertex_interpolation, const IndexRange coarse_face)
static void vertex_interpolation_from_corner (const SubdivMeshContext *ctx, VerticesForInterpolation *vertex_interpolation, const IndexRange coarse_face, const int corner)
static void vertex_interpolation_end (VerticesForInterpolation *vertex_interpolation)
Loop custom data interpolation helpers
static void loop_interpolation_init (const SubdivMeshContext *ctx, LoopsForInterpolation *loop_interpolation, const IndexRange coarse_face)
static void loop_interpolation_from_corner (const SubdivMeshContext *ctx, LoopsForInterpolation *loop_interpolation, const IndexRange coarse_face, const int corner)
static void loop_interpolation_end (LoopsForInterpolation *loop_interpolation)
TLS
static void subdiv_mesh_tls_free (void *tls_v)
Evaluation helper functions
static void subdiv_vertex_orco_evaluate (const SubdivMeshContext *ctx, const int ptex_face_index, const float u, const float v, const int subdiv_vertex_index)
Callbacks
static bool subdiv_mesh_topology_info (const ForeachContext *foreach_context, const int num_vertices, const int num_edges, const int num_loops, const int num_faces, const int *)
Vertex subdivision process
static void subdiv_vertex_data_copy (const SubdivMeshContext *ctx, const int coarse_vertex_index, const int subdiv_vertex_index)
static void subdiv_vertex_data_interpolate (const SubdivMeshContext *ctx, const int subdiv_vertex_index, const VerticesForInterpolation *vertex_interpolation, const float u, const float v)
static void evaluate_vertex_and_apply_displacement_copy (const SubdivMeshContext *ctx, const int ptex_face_index, const float u, const float v, const int coarse_vertex_index, const int subdiv_vertex_index)
static void evaluate_vertex_and_apply_displacement_interpolate (const SubdivMeshContext *ctx, const int ptex_face_index, const float u, const float v, VerticesForInterpolation *vertex_interpolation, const int subdiv_vertex_index)
static void subdiv_mesh_vertex_displacement_every_corner_or_edge (const ForeachContext *foreach_context, void *, const int ptex_face_index, const float u, const float v, const int subdiv_vertex_index)
static void subdiv_mesh_vertex_displacement_every_corner (const ForeachContext *foreach_context, void *tls, const int ptex_face_index, const float u, const float v, const int, const int, const int, const int subdiv_vertex_index)
static void subdiv_mesh_vertex_displacement_every_edge (const ForeachContext *foreach_context, void *tls, const int ptex_face_index, const float u, const float v, const int, const int, const int, const int subdiv_vertex_index)
static void subdiv_mesh_vertex_corner (const ForeachContext *foreach_context, void *, const int ptex_face_index, const float u, const float v, const int coarse_vertex_index, const int, const int, const int subdiv_vertex_index)
static void subdiv_mesh_ensure_vertex_interpolation (SubdivMeshContext *ctx, SubdivMeshTLS *tls, const int coarse_face_index, const int coarse_corner)
static void subdiv_mesh_vertex_edge (const ForeachContext *foreach_context, void *tls_v, const int ptex_face_index, const float u, const float v, const int, const int coarse_face_index, const int coarse_corner, const int subdiv_vertex_index)
static bool subdiv_mesh_is_center_vertex (const IndexRange coarse_face, const float u, const float v)
static void subdiv_mesh_tag_center_vertex (const IndexRange coarse_face, const int subdiv_vertex_index, const float u, const float v, Mesh *subdiv_mesh)
static void subdiv_mesh_vertex_inner (const ForeachContext *foreach_context, void *tls_v, const int ptex_face_index, const float u, const float v, const int coarse_face_index, const int coarse_corner, const int subdiv_vertex_index)
Edge subdivision process
static void subdiv_copy_edge_data (SubdivMeshContext *ctx, const int subdiv_edge_index, const int coarse_edge_index)
static void subdiv_mesh_edge (const ForeachContext *foreach_context, void *, const int coarse_edge_index, const int subdiv_edge_index, const bool, const int subdiv_v1, const int subdiv_v2)
Loops creation/interpolation
static void subdiv_interpolate_corner_data (const SubdivMeshContext *ctx, const int subdiv_loop_index, const LoopsForInterpolation *loop_interpolation, const float u, const float v)
static void subdiv_eval_uv_layer (SubdivMeshContext *ctx, const int corner_index, const int ptex_face_index, const float u, const float v)
static void subdiv_mesh_ensure_loop_interpolation (SubdivMeshContext *ctx, SubdivMeshTLS *tls, const int coarse_face_index, const int coarse_corner)
static void subdiv_mesh_loop (const ForeachContext *foreach_context, void *tls_v, const int ptex_face_index, const float u, const float v, const int, const int coarse_face_index, const int coarse_corner, const int subdiv_loop_index, const int subdiv_vertex_index, const int subdiv_edge_index)
Polygons subdivision process
static void subdiv_mesh_face (const ForeachContext *foreach_context, void *, const int coarse_face_index, const int subdiv_face_index, const int start_loop_index, const int)

Typedef Documentation

◆ ForeachEdgeCb

Initial value:
void (*)(const ForeachContext *context,
void *tls,
int coarse_edge_index,
int subdiv_edge_index,
bool is_loose,
int subdiv_v1,
int subdiv_v2)

Definition at line 57 of file BKE_subdiv_foreach.hh.

◆ ForeachLoopCb

Initial value:
void (*)(const ForeachContext *context,
void *tls,
int ptex_face_index,
float u,
float v,
int coarse_loop_index,
int coarse_face_index,
int coarse_corner,
int subdiv_loop_index,
int subdiv_vertex_index,
int subdiv_edge_index)
ATTR_WARN_UNUSED_RESULT const BMVert * v

Definition at line 65 of file BKE_subdiv_foreach.hh.

◆ ForeachLooseCb

Initial value:
void (*)(const ForeachContext *context,
void *tls,
int coarse_vertex_index,
int subdiv_vertex_index)

Definition at line 84 of file BKE_subdiv_foreach.hh.

◆ ForeachPolygonCb

Initial value:
void (*)(const ForeachContext *context,
void *tls,
int coarse_face_index,
int subdiv_face_index,
int start_loop_index,
int num_loops)

Definition at line 77 of file BKE_subdiv_foreach.hh.

◆ ForeachTopologyInformationCb

Initial value:
bool (*)(const ForeachContext *context,
int num_vertices,
int num_edges,
int num_loops,
int num_faces,
const int *subdiv_face_offset)

Definition at line 21 of file BKE_subdiv_foreach.hh.

◆ ForeachVertexFromCornerCb

Initial value:
void (*)(const ForeachContext *context,
void *tls,
int ptex_face_index,
float u,
float v,
int coarse_vertex_index,
int coarse_face_index,
int coarse_corner,
int subdiv_vertex_index)

Definition at line 28 of file BKE_subdiv_foreach.hh.

◆ ForeachVertexFromEdgeCb

Initial value:
void (*)(const ForeachContext *context,
void *tls,
int ptex_face_index,
float u,
float v,
int coarse_edge_index,
int coarse_face_index,
int coarse_corner,
int subdiv_vertex_index)

Definition at line 38 of file BKE_subdiv_foreach.hh.

◆ ForeachVertexInnerCb

Initial value:
void (*)(const ForeachContext *context,
void *tls,
int ptex_face_index,
float u,
float v,
int coarse_face_index,
int coarse_corner,
int subdiv_vertex_index)

Definition at line 48 of file BKE_subdiv_foreach.hh.

◆ ForeachVertexOfLooseEdgeCb

Initial value:
void (*)(const ForeachContext *context,
void *tls,
int coarse_edge_index,
float u,
int subdiv_vertex_index)

Definition at line 89 of file BKE_subdiv_foreach.hh.

Enumeration Type Documentation

◆ AverageWith

enum class blender::bke::subdiv::AverageWith : int8_t
strong
Enumerator
None 
All 
Prev 
Next 

Definition at line 59 of file subdiv_displacement_multires.cc.

◆ eSubdivEvaluatorType

Enumerator
SUBDIV_EVALUATOR_TYPE_CPU 
SUBDIV_EVALUATOR_TYPE_GPU 

Definition at line 22 of file BKE_subdiv_eval.hh.

◆ FVarLinearInterpolation

Enumerator
SUBDIV_FVAR_LINEAR_INTERPOLATION_NONE 
SUBDIV_FVAR_LINEAR_INTERPOLATION_CORNERS_ONLY 
SUBDIV_FVAR_LINEAR_INTERPOLATION_CORNERS_AND_JUNCTIONS 
SUBDIV_FVAR_LINEAR_INTERPOLATION_CORNERS_JUNCTIONS_AND_CONCAVE 
SUBDIV_FVAR_LINEAR_INTERPOLATION_BOUNDARIES 
SUBDIV_FVAR_LINEAR_INTERPOLATION_ALL 

Definition at line 34 of file BKE_subdiv.hh.

◆ StatsValue

Note
Order of enumerators MUST match order of values in SubdivStats.
Enumerator
SUBDIV_STATS_TOPOLOGY_REFINER_CREATION_TIME 
SUBDIV_STATS_SUBDIV_TO_MESH 
SUBDIV_STATS_SUBDIV_TO_MESH_GEOMETRY 
SUBDIV_STATS_EVALUATOR_CREATE 
SUBDIV_STATS_EVALUATOR_REFINE 
SUBDIV_STATS_SUBDIV_TO_CCG 
SUBDIV_STATS_SUBDIV_TO_CCG_ELEMENTS 
SUBDIV_STATS_TOPOLOGY_COMPARE 
NUM_SUBDIV_STATS_VALUES 

Definition at line 84 of file BKE_subdiv.hh.

◆ VtxBoundaryInterpolation

Enumerator
SUBDIV_VTX_BOUNDARY_NONE 

Do not interpolate boundaries.

SUBDIV_VTX_BOUNDARY_EDGE_ONLY 

Sharpen edges.

SUBDIV_VTX_BOUNDARY_EDGE_AND_CORNER 

Sharpen edges and corners.

Definition at line 25 of file BKE_subdiv.hh.

Function Documentation

◆ average_construct_tangent_matrix()

void blender::bke::subdiv::average_construct_tangent_matrix ( Subdiv & subdiv,
const int num_corners,
const int ptex_face_index,
const int corner,
const float u,
const float v,
float3x3 & r_tangent_matrix )
static

◆ average_convert_grid_coord_to_ptex()

void blender::bke::subdiv::average_convert_grid_coord_to_ptex ( const int num_corners,
const int corner,
const float grid_u,
const float grid_v,
float & r_ptex_face_u,
float & r_ptex_face_v )
static

◆ average_displacement()

void blender::bke::subdiv::average_displacement ( const Displacement & displacement,
const AverageWith average_with,
const int ptex_face_index,
const int corner,
const float grid_u,
const float grid_v,
float3 & r_D )
static

◆ average_get_other_ptex_and_corner()

void blender::bke::subdiv::average_get_other_ptex_and_corner ( const MultiresDisplacementData & data,
const int ptex_face_index,
const int corner,
const int corner_delta,
int & r_other_ptex_face_index,
int & r_other_corner_index )
static

◆ average_read_displacement_object()

void blender::bke::subdiv::average_read_displacement_object ( const MultiresDisplacementData & data,
const MDisps & displacement_grid,
const float grid_u,
const float grid_v,
const int ptex_face_index,
const int corner_index,
float3 & r_D )
static

◆ average_read_displacement_tangent()

void blender::bke::subdiv::average_read_displacement_tangent ( const MultiresDisplacementData & data,
const MDisps & other_displacement_grid,
const float grid_u,
const float grid_v,
float3 & r_tangent_D )
static

Definition at line 164 of file subdiv_displacement_multires.cc.

References data, and read_displacement_grid().

Referenced by average_read_displacement_object().

◆ average_with_all()

void blender::bke::subdiv::average_with_all ( const Displacement & displacement,
const int ptex_face_index,
const int corner,
const float ,
const float ,
float3 & r_D )
static

◆ average_with_next()

void blender::bke::subdiv::average_with_next ( const Displacement & displacement,
const int ptex_face_index,
const int corner,
const float grid_u,
const float ,
float3 & r_D )
static

Definition at line 262 of file subdiv_displacement_multires.cc.

References average_with_other().

Referenced by average_displacement().

◆ average_with_other()

void blender::bke::subdiv::average_with_other ( const Displacement & displacement,
const int ptex_face_index,
const int corner,
const float grid_u,
const float grid_v,
const int corner_delta,
float3 & r_D )
static

◆ average_with_prev()

void blender::bke::subdiv::average_with_prev ( const Displacement & displacement,
const int ptex_face_index,
const int corner,
const float ,
const float grid_v,
float3 & r_D )
static

Definition at line 272 of file subdiv_displacement_multires.cc.

References average_with_other().

Referenced by average_displacement().

◆ calculate_limit_positions()

◆ converter_free()

void blender::bke::subdiv::converter_free ( OpenSubdiv_Converter * converter)

Definition at line 15 of file subdiv_converter.cc.

References OpenSubdiv_Converter::freeUserData.

Referenced by new_from_mesh(), and update_from_mesh().

◆ converter_fvar_linear_from_settings()

◆ converter_init_for_mesh()

void blender::bke::subdiv::converter_init_for_mesh ( OpenSubdiv_Converter * converter,
const Settings * settings,
const Mesh * mesh )

◆ converter_vtx_boundary_interpolation_from_settings()

◆ count_num_ptex_faces()

int blender::bke::subdiv::count_num_ptex_faces ( const Mesh & mesh)
static

Definition at line 370 of file subdiv_displacement_multires.cc.

References faces.

Referenced by displacement_data_init_mapping().

◆ crease_to_sharpness()

BLI_INLINE float blender::bke::subdiv::crease_to_sharpness ( float crease)

◆ deform_coarse_vertices()

void blender::bke::subdiv::deform_coarse_vertices ( Subdiv * subdiv,
const Mesh * coarse_mesh,
MutableSpan< float3 > vert_positions )

◆ displacement_attach_from_multires()

void blender::bke::subdiv::displacement_attach_from_multires ( Subdiv * subdiv,
const Mesh * mesh,
const MultiresModifierData * mmd )

◆ displacement_data_init_mapping()

void blender::bke::subdiv::displacement_data_init_mapping ( Displacement & displacement,
const Mesh & mesh )
static

◆ displacement_detach()

void blender::bke::subdiv::displacement_detach ( Subdiv * subdiv)

Definition at line 15 of file subdiv_displacement.cc.

References MEM_freeN().

Referenced by displacement_attach_from_multires(), and free().

◆ displacement_get_face_corner()

int blender::bke::subdiv::displacement_get_face_corner ( const MultiresDisplacementData & data,
const int ptex_face_index,
const float u,
const float v )
static

◆ displacement_get_grid_and_coord()

int blender::bke::subdiv::displacement_get_grid_and_coord ( const Displacement & displacement,
const int ptex_face_index,
const float u,
const float v,
const MDisps ** r_displacement_grid,
float & r_grid_u,
float & r_grid_v )
static

◆ displacement_get_other_grid()

const MDisps * blender::bke::subdiv::displacement_get_other_grid ( const Displacement & displacement,
const int ptex_face_index,
const int corner,
const int corner_delta )
static

◆ displacement_init_data()

◆ displacement_init_functions()

◆ eval_begin()

bool blender::bke::subdiv::eval_begin ( Subdiv * subdiv,
eSubdivEvaluatorType evaluator_type,
OpenSubdiv_EvaluatorCache * evaluator_cache,
const OpenSubdiv_EvaluatorSettings * settings )

◆ eval_begin_from_mesh()

bool blender::bke::subdiv::eval_begin_from_mesh ( Subdiv * subdiv,
const Mesh * mesh,
eSubdivEvaluatorType evaluator_type,
Span< float3 > coarse_vert_positions = {},
OpenSubdiv_EvaluatorCache * evaluator_cache = nullptr )
Parameters
coarse_vert_positionsoptional span of positions to override the mesh positions.

Definition at line 221 of file subdiv_eval.cc.

References eval_begin(), eval_refine_from_mesh(), and UNUSED_VARS.

Referenced by BKE_subdiv_to_ccg_mesh(), deform_coarse_vertices(), blender::draw::draw_subdiv_create_requested_buffers(), multires_reshape_create_subdiv(), and subdiv_to_mesh().

◆ eval_displacement() [1/2]

void blender::bke::subdiv::eval_displacement ( Displacement * displacement,
const int ptex_face_index,
const float u,
const float v,
const float3 & dPdu,
const float3 & dPdv,
float3 & r_D )
static

◆ eval_displacement() [2/2]

void blender::bke::subdiv::eval_displacement ( Subdiv * subdiv,
int ptex_face_index,
float u,
float v,
const float3 & dPdu,
const float3 & dPdv,
float3 & r_D )
Note
Expects derivatives to be correct.

TODO(sergey): This is currently used together with eval_final_point() which can easily evaluate derivatives. Would be nice to have displacement evaluation function which does not require knowing derivatives ahead of a time.

Definition at line 372 of file subdiv_eval.cc.

References v.

Referenced by displacement_init_functions(), eval_final_point(), subdiv_accumulate_vertex_displacement(), and subdiv_accumulate_vertex_displacement().

◆ eval_face_varying()

void blender::bke::subdiv::eval_face_varying ( Subdiv * subdiv,
int face_varying_channel,
int ptex_face_index,
float u,
float v,
float2 & r_face_varying )

Evaluate face-varying layer (such as UV).

Definition at line 357 of file subdiv_eval.cc.

References UNUSED_VARS, and v.

Referenced by subdiv_eval_uv_layer().

◆ eval_final_point()

float3 blender::bke::subdiv::eval_final_point ( Subdiv * subdiv,
int ptex_face_index,
float u,
float v )

Evaluate point on a limit surface with displacement applied to it.

Definition at line 388 of file subdiv_eval.cc.

References D, eval_displacement(), eval_limit_point(), eval_limit_point_and_derivatives(), and v.

Referenced by subdiv_mesh_vertex_inner().

◆ eval_init_displacement()

void blender::bke::subdiv::eval_init_displacement ( Subdiv * subdiv)

Makes sure displacement evaluator is initialized.

Note
This function must be called once before evaluating displacement or final surface position.

Definition at line 276 of file subdiv_eval.cc.

Referenced by eval_begin().

◆ eval_limit_point()

float3 blender::bke::subdiv::eval_limit_point ( Subdiv * subdiv,
int ptex_face_index,
float u,
float v )

◆ eval_limit_point_and_derivatives()

void blender::bke::subdiv::eval_limit_point_and_derivatives ( Subdiv * subdiv,
int ptex_face_index,
float u,
float v,
float3 & r_P,
float3 & r_dPdu,
float3 & r_dPdv )

◆ eval_limit_point_and_normal()

void blender::bke::subdiv::eval_limit_point_and_normal ( Subdiv * subdiv,
int ptex_face_index,
float u,
float v,
float3 & r_P,
float3 & r_N )

◆ eval_refine_from_mesh()

◆ eval_vertex_data()

void blender::bke::subdiv::eval_vertex_data ( Subdiv * subdiv,
int ptex_face_index,
float u,
float v,
float r_vertex_data[] )

Evaluate smoothly interpolated vertex data (such as ORCO).

Definition at line 347 of file subdiv_eval.cc.

References UNUSED_VARS, and v.

Referenced by subdiv_vertex_orco_evaluate().

◆ evaluate_vertex_and_apply_displacement_copy()

◆ evaluate_vertex_and_apply_displacement_interpolate()

void blender::bke::subdiv::evaluate_vertex_and_apply_displacement_interpolate ( const SubdivMeshContext * ctx,
const int ptex_face_index,
const float u,
const float v,
VerticesForInterpolation * vertex_interpolation,
const int subdiv_vertex_index )
static

◆ exit()

void blender::bke::subdiv::exit ( )

Definition at line 38 of file subdiv.cc.

References openSubdiv_cleanup().

Referenced by WM_exit_ex().

◆ face_ptex_offset_get()

Span< int > blender::bke::subdiv::face_ptex_offset_get ( Subdiv * subdiv)

For each element in the array, this stores the total number of ptex faces up to that element, with the total number of ptex faces being the last element in the array. The array is of length base face count + 1.

Definition at line 214 of file subdiv.cc.

References blender::opensubdiv::TopologyRefinerImpl::base_level(), and UNUSED_VARS.

Referenced by context_init_common(), displacement_init_data(), subdiv_ccg_coord_to_ptex_coord(), and subdiv_foreach_ctx_init().

◆ find_edge_neighbors()

std::array< std::optional< int2 >, 2 > blender::bke::subdiv::find_edge_neighbors ( const Span< int2 > coarse_edges,
const GroupedSpan< int > vert_to_edge_map,
const int edge_index )
static

Definition at line 983 of file subdiv_mesh.cc.

References blender::Span< T >::size().

Referenced by mesh_interpolate_position_on_edge().

◆ find_loose_edge_interpolation_positions()

std::array< float3, 4 > blender::bke::subdiv::find_loose_edge_interpolation_positions ( const Span< float3 > coarse_positions,
const int2 & coarse_edge,
const std::array< std::optional< int2 >, 2 > & neighbors )
static

Definition at line 1000 of file subdiv_mesh.cc.

References blender::bke::mesh::edge_other_vert(), and result.

Referenced by mesh_interpolate_position_on_edge().

◆ finish_uv_layer()

void blender::bke::subdiv::finish_uv_layer ( const OpenSubdiv_Converter * )
static

Definition at line 228 of file subdiv_converter_mesh.cc.

Referenced by init_functions().

◆ foreach_subdiv_geometry()

bool blender::bke::subdiv::foreach_subdiv_geometry ( Subdiv * subdiv,
const ForeachContext * context,
const ToMeshSettings * mesh_settings,
const Mesh * coarse_mesh )

Invokes callbacks in the order and with values which corresponds to creation of final subdivided mesh.

Main goal is to abstract all the traversal routines to give geometry element indices (for vertices, edges, loops, faces) in the same way as subdivision modifier will do for a dense mesh.

Returns true if the whole topology was traversed, without any early exits.

TODO(sergey): Need to either get rid of subdiv or of coarse_mesh. The main point here is to be able to get base level topology, which can be done with either of those. Having both of them is kind of redundant.

Definition at line 1794 of file subdiv_foreach.cc.

References BLI_parallel_range_settings_defaults(), BLI_task_parallel_range(), blender::bke::subdiv::ForeachTaskContext::coarse_corner_edges, blender::bke::subdiv::ForeachTaskContext::coarse_corner_verts, blender::bke::subdiv::ForeachTaskContext::coarse_edges, blender::bke::subdiv::ForeachTaskContext::coarse_faces, blender::bke::subdiv::ForeachTaskContext::coarse_mesh, Mesh::edges_num, Mesh::faces_num, blender::bke::subdiv::ForeachTaskContext::foreach_context, TaskParallelSettings::func_free, TaskParallelSettings::min_iter_per_thread, blender::bke::subdiv::ForeachTaskContext::num_subdiv_edges, blender::bke::subdiv::ForeachTaskContext::num_subdiv_faces, blender::bke::subdiv::ForeachTaskContext::num_subdiv_loops, blender::bke::subdiv::ForeachTaskContext::num_subdiv_vertices, blender::bke::subdiv::ForeachTaskContext::settings, blender::bke::subdiv::ForeachTaskContext::subdiv_face_offset, subdiv_foreach_boundary_edges_task(), subdiv_foreach_ctx_free(), subdiv_foreach_ctx_init(), subdiv_foreach_free(), subdiv_foreach_loose_vertices_task(), subdiv_foreach_single_thread_tasks(), subdiv_foreach_task(), subdiv_foreach_vertices_of_loose_edges_task(), TaskParallelSettings::userdata_chunk, TaskParallelSettings::userdata_chunk_size, and Mesh::verts_num.

Referenced by deform_coarse_vertices(), multires_reshape_assign_final_coords_from_vertcos(), and subdiv_to_mesh().

◆ free()

◆ free_displacement()

void blender::bke::subdiv::free_displacement ( Displacement * displacement)
static

◆ free_user_data()

◆ fvar_interpolation_from_uv_smooth()

◆ get_edge_sharpness()

◆ get_edge_vertices()

void blender::bke::subdiv::get_edge_vertices ( const OpenSubdiv_Converter * converter,
int manifold_edge_index,
int * manifold_edge_vertices )
static

◆ get_face_corner_uv_index()

int blender::bke::subdiv::get_face_corner_uv_index ( const OpenSubdiv_Converter * converter,
const int face_index,
const int corner )
static

◆ get_face_vertices()

void blender::bke::subdiv::get_face_vertices ( const OpenSubdiv_Converter * converter,
int manifold_face_index,
int * manifold_face_vertices )
static

◆ get_fvar_linear_interpolation()

OpenSubdiv_FVarLinearInterpolation blender::bke::subdiv::get_fvar_linear_interpolation ( const OpenSubdiv_Converter * converter)
static

◆ get_num_edges()

int blender::bke::subdiv::get_num_edges ( const OpenSubdiv_Converter * converter)
static

◆ get_num_uv_layers()

int blender::bke::subdiv::get_num_uv_layers ( const OpenSubdiv_Converter * converter)
static

◆ get_num_uvs()

int blender::bke::subdiv::get_num_uvs ( const OpenSubdiv_Converter * converter)
static

◆ get_num_vertices()

int blender::bke::subdiv::get_num_vertices ( const OpenSubdiv_Converter * converter)
static

◆ get_scheme_type()

◆ get_vertex_sharpness()

◆ get_vtx_boundary_interpolation()

◆ grid_size_from_level()

◆ grid_uv_to_ptex_face_uv()

BLI_INLINE void blender::bke::subdiv::grid_uv_to_ptex_face_uv ( float grid_u,
float grid_v,
float * r_ptex_u,
float * r_ptex_v )

Inverse of above.

Definition at line 34 of file subdiv_inline.hh.

References BLI_INLINE.

Referenced by average_convert_grid_coord_to_ptex(), and multires_reshape_grid_coord_to_ptex().

◆ init()

void blender::bke::subdiv::init ( )

Definition at line 33 of file subdiv.cc.

References openSubdiv_init().

Referenced by WM_init().

◆ init_functions()

void blender::bke::subdiv::init_functions ( OpenSubdiv_Converter * converter)
static

◆ init_user_data()

◆ initialize()

void blender::bke::subdiv::initialize ( Displacement * displacement)
static

◆ initialize_manifold_index_array()

void blender::bke::subdiv::initialize_manifold_index_array ( const BitSpan not_used_map,
const int num_elements,
int ** r_indices,
int ** r_indices_reverse,
int * r_num_manifold_elements )
static

◆ initialize_manifold_indices()

◆ is_infinite_sharp_vertex()

◆ loop_interpolation_end()

◆ loop_interpolation_from_corner()

◆ loop_interpolation_init()

◆ loops_of_ptex_get()

◆ mesh_interpolate_position_on_edge()

float3 blender::bke::subdiv::mesh_interpolate_position_on_edge ( Span< float3 > coarse_positions,
Span< int2 > coarse_edges,
GroupedSpan< int > vert_to_edge_map,
int coarse_edge_index,
bool is_simple,
float u )

Interpolate a position along the coarse_edge at the relative u coordinate. If is_simple is false, this will perform a B-Spline interpolation using the edge neighbors, otherwise a linear interpolation will be done base on the edge vertices.

Definition at line 1026 of file subdiv_mesh.cc.

References find_edge_neighbors(), find_loose_edge_interpolation_positions(), blender::math::interpolate(), KEY_BSPLINE, key_curve_position_weights(), and blender::bke::attribute_math::mix4().

Referenced by subdiv_mesh_vertex_of_loose_edge().

◆ new_from_converter()

◆ new_from_mesh()

Subdiv * blender::bke::subdiv::new_from_mesh ( const Settings * settings,
const Mesh * mesh )

◆ num_edges_per_ptex_face_get()

BLI_INLINE int blender::bke::subdiv::num_edges_per_ptex_face_get ( const int resolution)

◆ num_faces_per_ptex_get()

BLI_INLINE int blender::bke::subdiv::num_faces_per_ptex_get ( const int resolution)

◆ num_inner_edges_per_ptex_face_get()

BLI_INLINE int blender::bke::subdiv::num_inner_edges_per_ptex_face_get ( const int resolution)

◆ num_ptex_faces_per_face_get()

BLI_INLINE int blender::bke::subdiv::num_ptex_faces_per_face_get ( const IndexRange face)

◆ precalc_uv_layer()

◆ ptex_face_resolution_get()

BLI_INLINE int blender::bke::subdiv::ptex_face_resolution_get ( const IndexRange face,
int resolution )

◆ ptex_face_uv_to_grid_uv() [1/2]

BLI_INLINE float2 blender::bke::subdiv::ptex_face_uv_to_grid_uv ( const float2 & ptex_uv)

Definition at line 29 of file subdiv_inline.hh.

References BLI_INLINE.

◆ ptex_face_uv_to_grid_uv() [2/2]

BLI_INLINE void blender::bke::subdiv::ptex_face_uv_to_grid_uv ( float ptex_u,
float ptex_v,
float * r_grid_u,
float * r_grid_v )

For a given (ptex_u, ptex_v) within a ptex face get corresponding (grid_u, grid_v) within a grid.

Definition at line 20 of file subdiv_inline.hh.

References BLI_INLINE.

Referenced by displacement_get_grid_and_coord(), mask_get_grid_and_coord(), multires_reshape_grid_coord_to_ptex(), and multires_reshape_ptex_coord_to_grid().

◆ read_displacement_grid()

BLI_INLINE AverageWith blender::bke::subdiv::read_displacement_grid ( const MDisps & displacement_grid,
const int grid_size,
const float grid_u,
const float grid_v,
float3 & r_tangent_D )

◆ rotate_grid_to_quad()

BLI_INLINE void blender::bke::subdiv::rotate_grid_to_quad ( int corner,
float grid_u,
float grid_v,
float * r_quad_u,
float * r_quad_v )

Converts (u, v) coordinate from within a grid to a quad coordinate in normalized ptex coordinates.

Definition at line 94 of file subdiv_inline.hh.

References BLI_assert, and BLI_INLINE.

Referenced by average_convert_grid_coord_to_ptex(), multires_reshape_grid_coord_to_ptex(), and subdiv_ccg_coord_to_ptex_coord().

◆ rotate_indices()

void blender::bke::subdiv::rotate_indices ( const int rot,
int * a,
int * b,
int * c,
int * d )
static

Definition at line 981 of file subdiv_foreach.cc.

References b, and rot.

Referenced by subdiv_foreach_loops_of_face().

◆ rotate_quad_to_corner() [1/2]

BLI_INLINE int blender::bke::subdiv::rotate_quad_to_corner ( float quad_u,
float quad_v,
float * r_corner_u,
float * r_corner_v )

Find per-corner coordinate with given per-face UV coord. Only handles quad and works in normalized coordinates.

Note
Output coordinates are in ptex coordinates.

Definition at line 48 of file subdiv_inline.hh.

References BLI_assert, and BLI_INLINE.

Referenced by displacement_get_face_corner(), displacement_get_grid_and_coord(), mask_get_grid_and_coord(), and multires_reshape_ptex_coord_to_grid().

◆ rotate_quad_to_corner() [2/2]

BLI_INLINE float2 blender::bke::subdiv::rotate_quad_to_corner ( int corner,
const float2 & quad )

Definition at line 78 of file subdiv_inline.hh.

References BLI_assert, BLI_INLINE, and quad.

◆ settings_equal()

◆ setup_foreach_callbacks() [1/2]

◆ setup_foreach_callbacks() [2/2]

◆ sharpness_to_crease()

BLI_INLINE float blender::bke::subdiv::sharpness_to_crease ( float sharpness)

◆ specifies_full_topology()

bool blender::bke::subdiv::specifies_full_topology ( const OpenSubdiv_Converter * )
static

Definition at line 99 of file subdiv_converter_mesh.cc.

Referenced by init_functions().

◆ stats_begin()

◆ stats_end()

◆ stats_init()

◆ stats_print()

void blender::bke::subdiv::stats_print ( const SubdivStats * stats)

Definition at line 44 of file subdiv_stats.cc.

References printf, and STATS_PRINT_TIME.

◆ stats_reset()

void blender::bke::subdiv::stats_reset ( SubdivStats * stats,
StatsValue value )

Definition at line 39 of file subdiv_stats.cc.

References blender::bke::subdiv::SubdivStats::values_.

Referenced by eval_begin().

◆ subdiv_accumulate_vertex_displacement() [1/2]

◆ subdiv_accumulate_vertex_displacement() [2/2]

void blender::bke::subdiv::subdiv_accumulate_vertex_displacement ( SubdivMeshContext * ctx,
const int ptex_face_index,
const float u,
const float v,
const int subdiv_vertex_index )
static

◆ subdiv_copy_edge_data()

◆ subdiv_eval_uv_layer()

void blender::bke::subdiv::subdiv_eval_uv_layer ( SubdivMeshContext * ctx,
const int corner_index,
const int ptex_face_index,
const float u,
const float v )
static

◆ subdiv_foreach_boundary_edges()

◆ subdiv_foreach_boundary_edges_task()

void blender::bke::subdiv::subdiv_foreach_boundary_edges_task ( void *__restrict userdata,
const int edge_index,
const TaskParallelTLS *__restrict tls )
static

Definition at line 1780 of file subdiv_foreach.cc.

References subdiv_foreach_boundary_edges().

Referenced by foreach_subdiv_geometry().

◆ subdiv_foreach_corner_vertices()

void blender::bke::subdiv::subdiv_foreach_corner_vertices ( ForeachTaskContext * ctx,
void * tls,
const int coarse_face_index )
static

◆ subdiv_foreach_corner_vertices_regular()

void blender::bke::subdiv::subdiv_foreach_corner_vertices_regular ( ForeachTaskContext * ctx,
void * tls,
const int coarse_face_index )
static

◆ subdiv_foreach_corner_vertices_regular_do()

◆ subdiv_foreach_corner_vertices_special()

void blender::bke::subdiv::subdiv_foreach_corner_vertices_special ( ForeachTaskContext * ctx,
void * tls,
const int coarse_face_index )
static

◆ subdiv_foreach_corner_vertices_special_do()

◆ subdiv_foreach_ctx_count()

◆ subdiv_foreach_ctx_free()

◆ subdiv_foreach_ctx_init()

◆ subdiv_foreach_ctx_init_offsets()

◆ subdiv_foreach_edge_vertices()

void blender::bke::subdiv::subdiv_foreach_edge_vertices ( ForeachTaskContext * ctx,
void * tls,
const int coarse_face_index )
static

◆ subdiv_foreach_edge_vertices_regular()

void blender::bke::subdiv::subdiv_foreach_edge_vertices_regular ( ForeachTaskContext * ctx,
void * tls,
const int coarse_face_index )
static

◆ subdiv_foreach_edge_vertices_regular_do()

◆ subdiv_foreach_edge_vertices_special()

void blender::bke::subdiv::subdiv_foreach_edge_vertices_special ( ForeachTaskContext * ctx,
void * tls,
const int coarse_face_index )
static

◆ subdiv_foreach_edge_vertices_special_do()

◆ subdiv_foreach_edges()

void blender::bke::subdiv::subdiv_foreach_edges ( ForeachTaskContext * ctx,
void * tls,
int face_index )
static

Definition at line 943 of file subdiv_foreach.cc.

References subdiv_foreach_edges_all_patches().

Referenced by subdiv_foreach_task().

◆ subdiv_foreach_edges_all_patches()

void blender::bke::subdiv::subdiv_foreach_edges_all_patches ( ForeachTaskContext * ctx,
void * tls,
const int coarse_face_index )
static

◆ subdiv_foreach_edges_all_patches_regular()

◆ subdiv_foreach_edges_all_patches_special()

◆ subdiv_foreach_edges_column()

int blender::bke::subdiv::subdiv_foreach_edges_column ( ForeachTaskContext * ctx,
void * tls,
const int coarse_start_edge_index,
const int coarse_end_edge_index,
const int start_subdiv_edge_index,
const int start_vertex_index,
const int num_edges_per_row )
static

◆ subdiv_foreach_edges_row()

int blender::bke::subdiv::subdiv_foreach_edges_row ( ForeachTaskContext * ctx,
void * tls,
const int coarse_edge_index,
const int start_subdiv_edge_index,
const int start_vertex_index,
const int num_edges_per_row )
static

◆ subdiv_foreach_every_corner_vertices()

◆ subdiv_foreach_every_corner_vertices_regular()

void blender::bke::subdiv::subdiv_foreach_every_corner_vertices_regular ( ForeachTaskContext * ctx,
void * tls,
const int coarse_face_index )
static

◆ subdiv_foreach_every_corner_vertices_special()

void blender::bke::subdiv::subdiv_foreach_every_corner_vertices_special ( ForeachTaskContext * ctx,
void * tls,
const int coarse_face_index )
static

◆ subdiv_foreach_every_edge_vertices()

◆ subdiv_foreach_every_edge_vertices_regular()

void blender::bke::subdiv::subdiv_foreach_every_edge_vertices_regular ( ForeachTaskContext * ctx,
void * tls,
const int coarse_face_index )
static

◆ subdiv_foreach_every_edge_vertices_special()

void blender::bke::subdiv::subdiv_foreach_every_edge_vertices_special ( ForeachTaskContext * ctx,
void * tls,
const int coarse_face_index )
static

◆ subdiv_foreach_faces()

◆ subdiv_foreach_free()

void blender::bke::subdiv::subdiv_foreach_free ( const void *__restrict userdata,
void *__restrict userdata_chunk )
static

◆ subdiv_foreach_inner_vertices()

void blender::bke::subdiv::subdiv_foreach_inner_vertices ( ForeachTaskContext * ctx,
void * tls,
const int coarse_face_index )
static

◆ subdiv_foreach_inner_vertices_regular()

◆ subdiv_foreach_inner_vertices_special()

◆ subdiv_foreach_loops()

void blender::bke::subdiv::subdiv_foreach_loops ( ForeachTaskContext * ctx,
void * tls,
int face_index )
static

◆ subdiv_foreach_loops_corner_index()

int blender::bke::subdiv::subdiv_foreach_loops_corner_index ( const float u,
const float v,
const float du,
const float dv )
static

Definition at line 1058 of file subdiv_foreach.cc.

References v.

Referenced by subdiv_foreach_loops_regular().

◆ subdiv_foreach_loops_of_face()

void blender::bke::subdiv::subdiv_foreach_loops_of_face ( ForeachTaskContext * ctx,
void * tls,
int subdiv_loop_start_index,
const int ptex_face_index,
const int coarse_face_index,
const int coarse_corner_index,
const int rotation,
int v0,
int e0,
int v1,
int e1,
int v2,
int e2,
int v3,
int e3,
const float u,
const float v,
const float du,
const float dv )
static

◆ subdiv_foreach_loops_regular()

◆ subdiv_foreach_loops_special()

◆ subdiv_foreach_loose_vertices_task()

void blender::bke::subdiv::subdiv_foreach_loose_vertices_task ( void *__restrict userdata,
const int coarse_vertex_index,
const TaskParallelTLS *__restrict tls )
static

◆ subdiv_foreach_mark_non_loose_geometry()

◆ subdiv_foreach_single_geometry_vertices()

◆ subdiv_foreach_single_thread_tasks()

◆ subdiv_foreach_task()

◆ subdiv_foreach_tls_alloc()

◆ subdiv_foreach_tls_free()

void blender::bke::subdiv::subdiv_foreach_tls_free ( ForeachTaskContext * ctx,
void * tls )
static

◆ subdiv_foreach_vertices()

void blender::bke::subdiv::subdiv_foreach_vertices ( ForeachTaskContext * ctx,
void * tls,
const int face_index )
static

◆ subdiv_foreach_vertices_of_loose_edges_task()

◆ subdiv_interpolate_corner_data()

void blender::bke::subdiv::subdiv_interpolate_corner_data ( const SubdivMeshContext * ctx,
const int subdiv_loop_index,
const LoopsForInterpolation * loop_interpolation,
const float u,
const float v )
static

◆ subdiv_mesh_context_free() [1/2]

void blender::bke::subdiv::subdiv_mesh_context_free ( SubdivDeformContext * ctx)
static

◆ subdiv_mesh_context_free() [2/2]

◆ subdiv_mesh_ctx_cache_custom_data_layers()

◆ subdiv_mesh_ctx_cache_uv_layers()

◆ subdiv_mesh_edge()

void blender::bke::subdiv::subdiv_mesh_edge ( const ForeachContext * foreach_context,
void * ,
const int coarse_edge_index,
const int subdiv_edge_index,
const bool ,
const int subdiv_v1,
const int subdiv_v2 )
static

◆ subdiv_mesh_ensure_loop_interpolation()

◆ subdiv_mesh_ensure_vertex_interpolation()

◆ subdiv_mesh_face()

void blender::bke::subdiv::subdiv_mesh_face ( const ForeachContext * foreach_context,
void * ,
const int coarse_face_index,
const int subdiv_face_index,
const int start_loop_index,
const int  )
static

◆ subdiv_mesh_is_center_vertex()

bool blender::bke::subdiv::subdiv_mesh_is_center_vertex ( const IndexRange coarse_face,
const float u,
const float v )
static

Definition at line 763 of file subdiv_mesh.cc.

References blender::IndexRange::size(), and v.

Referenced by subdiv_mesh_tag_center_vertex().

◆ subdiv_mesh_loop()

void blender::bke::subdiv::subdiv_mesh_loop ( const ForeachContext * foreach_context,
void * tls_v,
const int ptex_face_index,
const float u,
const float v,
const int ,
const int coarse_face_index,
const int coarse_corner,
const int subdiv_loop_index,
const int subdiv_vertex_index,
const int subdiv_edge_index )
static

◆ subdiv_mesh_prepare_accumulator() [1/2]

void blender::bke::subdiv::subdiv_mesh_prepare_accumulator ( SubdivDeformContext * ctx,
int num_vertices )
static

◆ subdiv_mesh_prepare_accumulator() [2/2]

void blender::bke::subdiv::subdiv_mesh_prepare_accumulator ( SubdivMeshContext * ctx,
int num_vertices )
static

◆ subdiv_mesh_tag_center_vertex()

void blender::bke::subdiv::subdiv_mesh_tag_center_vertex ( const IndexRange coarse_face,
const int subdiv_vertex_index,
const float u,
const float v,
Mesh * subdiv_mesh )
static

Definition at line 780 of file subdiv_mesh.cc.

References Mesh::runtime, subdiv_mesh_is_center_vertex(), and v.

Referenced by subdiv_mesh_vertex_inner().

◆ subdiv_mesh_tls_free()

◆ subdiv_mesh_topology_info() [1/2]

◆ subdiv_mesh_topology_info() [2/2]

bool blender::bke::subdiv::subdiv_mesh_topology_info ( const ForeachContext * foreach_context,
const int ,
const int ,
const int ,
const int ,
const int *  )
static

◆ subdiv_mesh_vertex_corner() [1/2]

void blender::bke::subdiv::subdiv_mesh_vertex_corner ( const ForeachContext * foreach_context,
void * ,
const int ptex_face_index,
const float u,
const float v,
const int coarse_vertex_index,
const int ,
const int ,
const int subdiv_vertex_index )
static

◆ subdiv_mesh_vertex_corner() [2/2]

void blender::bke::subdiv::subdiv_mesh_vertex_corner ( const ForeachContext * foreach_context,
void * ,
const int ptex_face_index,
const float u,
const float v,
const int coarse_vertex_index,
const int ,
const int ,
const int  )
static

◆ subdiv_mesh_vertex_displacement_every_corner()

void blender::bke::subdiv::subdiv_mesh_vertex_displacement_every_corner ( const ForeachContext * foreach_context,
void * tls,
const int ptex_face_index,
const float u,
const float v,
const int ,
const int ,
const int ,
const int subdiv_vertex_index )
static

Definition at line 671 of file subdiv_mesh.cc.

References subdiv_mesh_vertex_displacement_every_corner_or_edge(), and v.

Referenced by setup_foreach_callbacks().

◆ subdiv_mesh_vertex_displacement_every_corner_or_edge()

void blender::bke::subdiv::subdiv_mesh_vertex_displacement_every_corner_or_edge ( const ForeachContext * foreach_context,
void * ,
const int ptex_face_index,
const float u,
const float v,
const int subdiv_vertex_index )
static

◆ subdiv_mesh_vertex_displacement_every_edge()

void blender::bke::subdiv::subdiv_mesh_vertex_displacement_every_edge ( const ForeachContext * foreach_context,
void * tls,
const int ptex_face_index,
const float u,
const float v,
const int ,
const int ,
const int ,
const int subdiv_vertex_index )
static

Definition at line 685 of file subdiv_mesh.cc.

References subdiv_mesh_vertex_displacement_every_corner_or_edge(), and v.

Referenced by setup_foreach_callbacks().

◆ subdiv_mesh_vertex_edge()

void blender::bke::subdiv::subdiv_mesh_vertex_edge ( const ForeachContext * foreach_context,
void * tls_v,
const int ptex_face_index,
const float u,
const float v,
const int ,
const int coarse_face_index,
const int coarse_corner,
const int subdiv_vertex_index )
static

◆ subdiv_mesh_vertex_every_corner()

void blender::bke::subdiv::subdiv_mesh_vertex_every_corner ( const ForeachContext * foreach_context,
void * ,
const int ptex_face_index,
const float u,
const float v,
const int coarse_vertex_index,
const int ,
const int ,
const int  )
static

◆ subdiv_mesh_vertex_inner()

◆ subdiv_mesh_vertex_loose()

void blender::bke::subdiv::subdiv_mesh_vertex_loose ( const ForeachContext * foreach_context,
void * ,
const int coarse_vertex_index,
const int subdiv_vertex_index )
static

◆ subdiv_mesh_vertex_of_loose_edge()

◆ subdiv_mesh_vertex_of_loose_edge_interpolate()

void blender::bke::subdiv::subdiv_mesh_vertex_of_loose_edge_interpolate ( SubdivMeshContext * ctx,
const int2 & coarse_edge,
const float u,
const int subdiv_vertex_index )
static

◆ subdiv_to_mesh()

Mesh * blender::bke::subdiv::subdiv_to_mesh ( Subdiv * subdiv,
const ToMeshSettings * settings,
const Mesh * coarse_mesh )

Create real hi-res mesh from subdivision, all geometry is "real".

Definition at line 1129 of file subdiv_mesh.cc.

References blender::bke::mesh::build_vert_to_edge_map(), CD_PROP_INT32, blender::bke::subdiv::SubdivMeshContext::coarse_corner_verts, blender::bke::subdiv::SubdivMeshContext::coarse_edges, blender::bke::subdiv::SubdivMeshContext::coarse_faces, blender::bke::subdiv::SubdivMeshContext::coarse_mesh, blender::bke::subdiv::SubdivMeshContext::coarse_positions, CustomData_add_layer_named_with_data(), eval_begin_from_mesh(), Mesh::faces_num, foreach_subdiv_geometry(), blender::bke::subdiv::SubdivMeshContext::have_displacement, Array< T, InlineBufferCapacity, Allocator >::is_empty(), result, Mesh::runtime, blender::bke::subdiv::SubdivMeshContext::settings, setup_foreach_callbacks(), stats_begin(), stats_end(), blender::bke::subdiv::SubdivMeshContext::subdiv, blender::bke::subdiv::SubdivMeshContext::subdiv_corner_edges, blender::bke::subdiv::SubdivMeshContext::subdiv_corner_verts, blender::bke::subdiv::SubdivMeshContext::subdiv_display_edges, SUBDIV_EVALUATOR_TYPE_CPU, blender::bke::subdiv::SubdivMeshContext::subdiv_mesh, subdiv_mesh_context_free(), SUBDIV_STATS_SUBDIV_TO_MESH, SUBDIV_STATS_SUBDIV_TO_MESH_GEOMETRY, blender::bke::subdiv::ForeachContext::user_data, blender::bke::subdiv::ForeachContext::user_data_tls, blender::bke::subdiv::ForeachContext::user_data_tls_size, blender::bke::subdiv::SubdivMeshContext::vert_to_edge_indices, blender::bke::subdiv::SubdivMeshContext::vert_to_edge_map, blender::bke::subdiv::SubdivMeshContext::vert_to_edge_offsets, and Mesh::verts_num.

Referenced by mesh_wrapper_ensure_subdivision(), multires_as_mesh(), subdiv_as_mesh(), and subdivide_edit_mesh().

◆ subdiv_vertex_data_copy()

void blender::bke::subdiv::subdiv_vertex_data_copy ( const SubdivMeshContext * ctx,
const int coarse_vertex_index,
const int subdiv_vertex_index )
static

◆ subdiv_vertex_data_interpolate()

◆ subdiv_vertex_orco_evaluate()

void blender::bke::subdiv::subdiv_vertex_orco_evaluate ( const SubdivMeshContext * ctx,
const int ptex_face_index,
const float u,
const float v,
const int subdiv_vertex_index )
static

◆ topology_num_fvar_layers_get()

int blender::bke::subdiv::topology_num_fvar_layers_get ( const Subdiv * subdiv)

◆ update_from_converter()

Subdiv * blender::bke::subdiv::update_from_converter ( Subdiv * subdiv,
const Settings * settings,
OpenSubdiv_Converter * converter )

Similar to above, but will not re-create descriptor if it was created for the same settings and topology. If settings or topology did change, the existing descriptor is freed and a new one is created from scratch.

Note
It is allowed to pass NULL as an existing subdivision surface descriptor. This will create a new descriptor without any extra checks.

Definition at line 145 of file subdiv.cc.

References free(), new_from_converter(), settings_equal(), stats_begin(), stats_end(), SUBDIV_STATS_TOPOLOGY_COMPARE, and UNUSED_VARS.

Referenced by update_from_mesh().

◆ update_from_mesh()

Subdiv * blender::bke::subdiv::update_from_mesh ( Subdiv * subdiv,
const Settings * settings,
const Mesh * mesh )

◆ vertex_interpolation_end()

◆ vertex_interpolation_from_corner()

◆ vertex_interpolation_init()

◆ vtx_boundary_interpolation_from_subsurf()