Blender  V3.3
Classes
subdiv_mesh.c File Reference
#include "atomic_ops.h"
#include "DNA_key_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "BLI_alloca.h"
#include "BLI_bitmap.h"
#include "BLI_math_vector.h"
#include "BKE_customdata.h"
#include "BKE_key.h"
#include "BKE_mesh.h"
#include "BKE_subdiv.h"
#include "BKE_subdiv_eval.h"
#include "BKE_subdiv_foreach.h"
#include "BKE_subdiv_mesh.h"
#include "MEM_guardedalloc.h"

Go to the source code of this file.

Classes

struct  SubdivMeshContext
 
struct  LoopsOfPtex
 
struct  VerticesForInterpolation
 
struct  LoopsForInterpolation
 
struct  SubdivMeshTLS
 

Functions

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)
 
Accumulation helpers
static void subdiv_accumulate_vertex_displacement (SubdivMeshContext *ctx, const int ptex_face_index, const float u, const float v, MVert *subdiv_vert)
 
Callbacks
static bool subdiv_mesh_topology_info (const SubdivForeachContext *foreach_context, const int num_vertices, const int num_edges, const int num_loops, const int num_polygons, const int *UNUSED(subdiv_polygon_offset))
 
Vertex subdivision process
static void subdiv_vertex_data_copy (const SubdivMeshContext *ctx, const MVert *coarse_vertex, MVert *subdiv_vertex)
 
static void subdiv_vertex_data_interpolate (const SubdivMeshContext *ctx, MVert *subdiv_vertex, 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 MVert *coarse_vert, MVert *subdiv_vert)
 
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, MVert *subdiv_vert)
 
static void subdiv_mesh_vertex_displacement_every_corner_or_edge (const SubdivForeachContext *foreach_context, void *UNUSED(tls), 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 SubdivForeachContext *foreach_context, void *tls, const int ptex_face_index, const float u, const float v, const int UNUSED(coarse_vertex_index), const int UNUSED(coarse_poly_index), const int UNUSED(coarse_corner), const int subdiv_vertex_index)
 
static void subdiv_mesh_vertex_displacement_every_edge (const SubdivForeachContext *foreach_context, void *tls, const int ptex_face_index, const float u, const float v, const int UNUSED(coarse_edge_index), const int UNUSED(coarse_poly_index), const int UNUSED(coarse_corner), const int subdiv_vertex_index)
 
static void subdiv_mesh_vertex_corner (const SubdivForeachContext *foreach_context, void *UNUSED(tls), const int ptex_face_index, const float u, const float v, const int coarse_vertex_index, const int UNUSED(coarse_poly_index), const int UNUSED(coarse_corner), const int subdiv_vertex_index)
 
static void subdiv_mesh_ensure_vertex_interpolation (SubdivMeshContext *ctx, SubdivMeshTLS *tls, const MPoly *coarse_poly, const int coarse_corner)
 
static void subdiv_mesh_vertex_edge (const SubdivForeachContext *foreach_context, void *tls_v, const int ptex_face_index, const float u, const float v, const int UNUSED(coarse_edge_index), const int coarse_poly_index, const int coarse_corner, const int subdiv_vertex_index)
 
static bool subdiv_mesh_is_center_vertex (const MPoly *coarse_poly, const float u, const float v)
 
static void subdiv_mesh_tag_center_vertex (const MPoly *coarse_poly, const int subdiv_vertex_index, const float u, const float v, Mesh *subdiv_mesh)
 
static void subdiv_mesh_vertex_inner (const SubdivForeachContext *foreach_context, void *tls_v, const int ptex_face_index, const float u, const float v, const int coarse_poly_index, const int coarse_corner, const int subdiv_vertex_index)
 
Edge subdivision process
static void subdiv_copy_edge_data (SubdivMeshContext *ctx, MEdge *subdiv_edge, const MEdge *coarse_edge)
 
static void subdiv_mesh_edge (const SubdivForeachContext *foreach_context, void *UNUSED(tls), const int coarse_edge_index, const int subdiv_edge_index, const bool UNUSED(is_loose), const int subdiv_v1, const int subdiv_v2)
 
Loops creation/interpolation
static void subdiv_interpolate_loop_data (const SubdivMeshContext *ctx, MLoop *subdiv_loop, const LoopsForInterpolation *loop_interpolation, const float u, const float v)
 
static void subdiv_eval_uv_layer (SubdivMeshContext *ctx, MLoop *subdiv_loop, const int ptex_face_index, const float u, const float v)
 
static void subdiv_mesh_ensure_loop_interpolation (SubdivMeshContext *ctx, SubdivMeshTLS *tls, const MPoly *coarse_poly, const int coarse_corner)
 
static void subdiv_mesh_loop (const SubdivForeachContext *foreach_context, void *tls_v, const int ptex_face_index, const float u, const float v, const int UNUSED(coarse_loop_index), const int coarse_poly_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_copy_poly_data (const SubdivMeshContext *ctx, MPoly *subdiv_poly, const MPoly *coarse_poly)
 
static void subdiv_mesh_poly (const SubdivForeachContext *foreach_context, void *UNUSED(tls), const int coarse_poly_index, const int subdiv_poly_index, const int start_loop_index, const int num_loops)
 
Loose elements subdivision process
static void subdiv_mesh_vertex_loose (const SubdivForeachContext *foreach_context, void *UNUSED(tls), const int coarse_vertex_index, const int subdiv_vertex_index)
 
static void find_edge_neighbors (const Mesh *coarse_mesh, const MEdge *edge, const MEdge *neighbors[2])
 
static void points_for_loose_edges_interpolation_get (const Mesh *coarse_mesh, const MEdge *coarse_edge, const MEdge *neighbors[2], float points_r[4][3])
 
void BKE_subdiv_mesh_interpolate_position_on_edge (const Mesh *coarse_mesh, const MEdge *coarse_edge, const bool is_simple, const float u, float pos_r[3])
 
static void subdiv_mesh_vertex_of_loose_edge_interpolate (SubdivMeshContext *ctx, const MEdge *coarse_edge, const float u, const int subdiv_vertex_index)
 
static void subdiv_mesh_vertex_of_loose_edge (const struct SubdivForeachContext *foreach_context, void *UNUSED(tls), const int coarse_edge_index, const float u, const int subdiv_vertex_index)
 
Initialization
static void setup_foreach_callbacks (const SubdivMeshContext *subdiv_context, SubdivForeachContext *foreach_context)
 
Public entry point
MeshBKE_subdiv_to_mesh (Subdiv *subdiv, const SubdivToMeshSettings *settings, const Mesh *coarse_mesh)
 

Subdivision Context

typedef struct SubdivMeshContext SubdivMeshContext
 
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)
 

Loop custom data copy helpers

typedef struct LoopsOfPtex LoopsOfPtex
 
static void loops_of_ptex_get (const SubdivMeshContext *ctx, LoopsOfPtex *loops_of_ptex, const MPoly *coarse_poly, const int ptex_of_poly_index)
 

Vertex custom data interpolation helpers

typedef struct VerticesForInterpolation VerticesForInterpolation
 
static void vertex_interpolation_init (const SubdivMeshContext *ctx, VerticesForInterpolation *vertex_interpolation, const MPoly *coarse_poly)
 
static void vertex_interpolation_from_corner (const SubdivMeshContext *ctx, VerticesForInterpolation *vertex_interpolation, const MPoly *coarse_poly, const int corner)
 
static void vertex_interpolation_end (VerticesForInterpolation *vertex_interpolation)
 

Loop custom data interpolation helpers

typedef struct LoopsForInterpolation LoopsForInterpolation
 
static void loop_interpolation_init (const SubdivMeshContext *ctx, LoopsForInterpolation *loop_interpolation, const MPoly *coarse_poly)
 
static void loop_interpolation_from_corner (const SubdivMeshContext *ctx, LoopsForInterpolation *loop_interpolation, const MPoly *coarse_poly, const int corner)
 
static void loop_interpolation_end (LoopsForInterpolation *loop_interpolation)
 

TLS

typedef struct SubdivMeshTLS SubdivMeshTLS
 
static void subdiv_mesh_tls_free (void *tls_v)
 

Typedef Documentation

◆ LoopsForInterpolation

◆ LoopsOfPtex

typedef struct LoopsOfPtex LoopsOfPtex

◆ SubdivMeshContext

◆ SubdivMeshTLS

typedef struct SubdivMeshTLS SubdivMeshTLS

◆ VerticesForInterpolation

Function Documentation

◆ BKE_subdiv_mesh_interpolate_position_on_edge()

void BKE_subdiv_mesh_interpolate_position_on_edge ( const Mesh coarse_mesh,
const MEdge coarse_edge,
const bool  is_simple,
const float  u,
float  pos_r[3] 
)

◆ BKE_subdiv_to_mesh()

Mesh* BKE_subdiv_to_mesh ( Subdiv subdiv,
const SubdivToMeshSettings settings,
const Mesh coarse_mesh 
)

◆ evaluate_vertex_and_apply_displacement_copy()

static void evaluate_vertex_and_apply_displacement_copy ( const SubdivMeshContext ctx,
const int  ptex_face_index,
const float  u,
const float  v,
const MVert coarse_vert,
MVert subdiv_vert 
)
static

◆ evaluate_vertex_and_apply_displacement_interpolate()

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,
MVert subdiv_vert 
)
static

◆ find_edge_neighbors()

static void find_edge_neighbors ( const Mesh coarse_mesh,
const MEdge edge,
const MEdge neighbors[2] 
)
static

◆ loop_interpolation_end()

static void loop_interpolation_end ( LoopsForInterpolation loop_interpolation)
static

◆ loop_interpolation_from_corner()

static void loop_interpolation_from_corner ( const SubdivMeshContext ctx,
LoopsForInterpolation loop_interpolation,
const MPoly coarse_poly,
const int  corner 
)
static

◆ loop_interpolation_init()

static void loop_interpolation_init ( const SubdivMeshContext ctx,
LoopsForInterpolation loop_interpolation,
const MPoly coarse_poly 
)
static

◆ loops_of_ptex_get()

static void loops_of_ptex_get ( const SubdivMeshContext ctx,
LoopsOfPtex loops_of_ptex,
const MPoly coarse_poly,
const int  ptex_of_poly_index 
)
static

◆ points_for_loose_edges_interpolation_get()

static void points_for_loose_edges_interpolation_get ( const Mesh coarse_mesh,
const MEdge coarse_edge,
const MEdge neighbors[2],
float  points_r[4][3] 
)
static

◆ setup_foreach_callbacks()

static void setup_foreach_callbacks ( const SubdivMeshContext subdiv_context,
SubdivForeachContext foreach_context 
)
static

◆ subdiv_accumulate_vertex_displacement()

static void subdiv_accumulate_vertex_displacement ( SubdivMeshContext ctx,
const int  ptex_face_index,
const float  u,
const float  v,
MVert subdiv_vert 
)
static

◆ subdiv_copy_edge_data()

static void subdiv_copy_edge_data ( SubdivMeshContext ctx,
MEdge subdiv_edge,
const MEdge coarse_edge 
)
static

◆ subdiv_copy_poly_data()

static void subdiv_copy_poly_data ( const SubdivMeshContext ctx,
MPoly subdiv_poly,
const MPoly coarse_poly 
)
static

◆ subdiv_eval_uv_layer()

static void subdiv_eval_uv_layer ( SubdivMeshContext ctx,
MLoop subdiv_loop,
const int  ptex_face_index,
const float  u,
const float  v 
)
static

◆ subdiv_interpolate_loop_data()

static void subdiv_interpolate_loop_data ( const SubdivMeshContext ctx,
MLoop subdiv_loop,
const LoopsForInterpolation loop_interpolation,
const float  u,
const float  v 
)
static

◆ subdiv_mesh_context_free()

static void subdiv_mesh_context_free ( SubdivMeshContext ctx)
static

Definition at line 87 of file subdiv_mesh.c.

References SubdivMeshContext::accumulated_counters, and MEM_SAFE_FREE.

Referenced by BKE_subdiv_to_mesh().

◆ subdiv_mesh_ctx_cache_custom_data_layers()

static void subdiv_mesh_ctx_cache_custom_data_layers ( SubdivMeshContext ctx)
static

◆ subdiv_mesh_ctx_cache_uv_layers()

static void subdiv_mesh_ctx_cache_uv_layers ( SubdivMeshContext ctx)
static

◆ subdiv_mesh_edge()

static void subdiv_mesh_edge ( const SubdivForeachContext foreach_context,
void UNUSEDtls,
const int  coarse_edge_index,
const int  subdiv_edge_index,
const bool   UNUSEDis_loose,
const int  subdiv_v1,
const int  subdiv_v2 
)
static

◆ subdiv_mesh_ensure_loop_interpolation()

static void subdiv_mesh_ensure_loop_interpolation ( SubdivMeshContext ctx,
SubdivMeshTLS tls,
const MPoly coarse_poly,
const int  coarse_corner 
)
static

◆ subdiv_mesh_ensure_vertex_interpolation()

static void subdiv_mesh_ensure_vertex_interpolation ( SubdivMeshContext ctx,
SubdivMeshTLS tls,
const MPoly coarse_poly,
const int  coarse_corner 
)
static

◆ subdiv_mesh_is_center_vertex()

static bool subdiv_mesh_is_center_vertex ( const MPoly coarse_poly,
const float  u,
const float  v 
)
static

Definition at line 714 of file subdiv_mesh.c.

References MPoly::totloop, and v.

Referenced by subdiv_mesh_tag_center_vertex().

◆ subdiv_mesh_loop()

static void subdiv_mesh_loop ( const SubdivForeachContext foreach_context,
void tls_v,
const int  ptex_face_index,
const float  u,
const float  v,
const int   UNUSEDcoarse_loop_index,
const int  coarse_poly_index,
const int  coarse_corner,
const int  subdiv_loop_index,
const int  subdiv_vertex_index,
const int  subdiv_edge_index 
)
static

◆ subdiv_mesh_poly()

static void subdiv_mesh_poly ( const SubdivForeachContext foreach_context,
void UNUSEDtls,
const int  coarse_poly_index,
const int  subdiv_poly_index,
const int  start_loop_index,
const int  num_loops 
)
static

◆ subdiv_mesh_prepare_accumulator()

static void subdiv_mesh_prepare_accumulator ( SubdivMeshContext ctx,
int  num_vertices 
)
static

◆ subdiv_mesh_tag_center_vertex()

static void subdiv_mesh_tag_center_vertex ( const MPoly coarse_poly,
const int  subdiv_vertex_index,
const float  u,
const float  v,
Mesh subdiv_mesh 
)
static

◆ subdiv_mesh_tls_free()

static void subdiv_mesh_tls_free ( void tls_v)
static

◆ subdiv_mesh_topology_info()

static bool subdiv_mesh_topology_info ( const SubdivForeachContext foreach_context,
const int  num_vertices,
const int  num_edges,
const int  num_loops,
const int  num_polygons,
const int *  UNUSEDsubdiv_polygon_offset 
)
static

◆ subdiv_mesh_vertex_corner()

static void subdiv_mesh_vertex_corner ( const SubdivForeachContext foreach_context,
void UNUSEDtls,
const int  ptex_face_index,
const float  u,
const float  v,
const int  coarse_vertex_index,
const int   UNUSEDcoarse_poly_index,
const int   UNUSEDcoarse_corner,
const int  subdiv_vertex_index 
)
static

◆ subdiv_mesh_vertex_displacement_every_corner()

static void subdiv_mesh_vertex_displacement_every_corner ( const SubdivForeachContext foreach_context,
void tls,
const int  ptex_face_index,
const float  u,
const float  v,
const int   UNUSEDcoarse_vertex_index,
const int   UNUSEDcoarse_poly_index,
const int   UNUSEDcoarse_corner,
const int  subdiv_vertex_index 
)
static

Definition at line 612 of file subdiv_mesh.c.

References subdiv_mesh_vertex_displacement_every_corner_or_edge(), and v.

Referenced by setup_foreach_callbacks().

◆ subdiv_mesh_vertex_displacement_every_corner_or_edge()

static void subdiv_mesh_vertex_displacement_every_corner_or_edge ( const SubdivForeachContext foreach_context,
void UNUSEDtls,
const int  ptex_face_index,
const float  u,
const float  v,
const int  subdiv_vertex_index 
)
static

◆ subdiv_mesh_vertex_displacement_every_edge()

static void subdiv_mesh_vertex_displacement_every_edge ( const SubdivForeachContext foreach_context,
void tls,
const int  ptex_face_index,
const float  u,
const float  v,
const int   UNUSEDcoarse_edge_index,
const int   UNUSEDcoarse_poly_index,
const int   UNUSEDcoarse_corner,
const int  subdiv_vertex_index 
)
static

Definition at line 627 of file subdiv_mesh.c.

References subdiv_mesh_vertex_displacement_every_corner_or_edge(), and v.

Referenced by setup_foreach_callbacks().

◆ subdiv_mesh_vertex_edge()

static void subdiv_mesh_vertex_edge ( const SubdivForeachContext foreach_context,
void tls_v,
const int  ptex_face_index,
const float  u,
const float  v,
const int   UNUSEDcoarse_edge_index,
const int  coarse_poly_index,
const int  coarse_corner,
const int  subdiv_vertex_index 
)
static

◆ subdiv_mesh_vertex_inner()

static void subdiv_mesh_vertex_inner ( const SubdivForeachContext foreach_context,
void tls_v,
const int  ptex_face_index,
const float  u,
const float  v,
const int  coarse_poly_index,
const int  coarse_corner,
const int  subdiv_vertex_index 
)
static

◆ subdiv_mesh_vertex_loose()

static void subdiv_mesh_vertex_loose ( const SubdivForeachContext foreach_context,
void UNUSEDtls,
const int  coarse_vertex_index,
const int  subdiv_vertex_index 
)
static

◆ subdiv_mesh_vertex_of_loose_edge()

static void subdiv_mesh_vertex_of_loose_edge ( const struct SubdivForeachContext foreach_context,
void UNUSEDtls,
const int  coarse_edge_index,
const float  u,
const int  subdiv_vertex_index 
)
static

◆ subdiv_mesh_vertex_of_loose_edge_interpolate()

static void subdiv_mesh_vertex_of_loose_edge_interpolate ( SubdivMeshContext ctx,
const MEdge coarse_edge,
const float  u,
const int  subdiv_vertex_index 
)
static

◆ subdiv_vertex_data_copy()

static void subdiv_vertex_data_copy ( const SubdivMeshContext ctx,
const MVert coarse_vertex,
MVert subdiv_vertex 
)
static

◆ subdiv_vertex_data_interpolate()

static void subdiv_vertex_data_interpolate ( const SubdivMeshContext ctx,
MVert subdiv_vertex,
const VerticesForInterpolation vertex_interpolation,
const float  u,
const float  v 
)
static

◆ subdiv_vertex_orco_evaluate()

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 
)
static

◆ vertex_interpolation_end()

static void vertex_interpolation_end ( VerticesForInterpolation vertex_interpolation)
static

◆ vertex_interpolation_from_corner()

static void vertex_interpolation_from_corner ( const SubdivMeshContext ctx,
VerticesForInterpolation vertex_interpolation,
const MPoly coarse_poly,
const int  corner 
)
static

◆ vertex_interpolation_init()

static void vertex_interpolation_init ( const SubdivMeshContext ctx,
VerticesForInterpolation vertex_interpolation,
const MPoly coarse_poly 
)
static