Blender V4.3
subsurf_ccg.cc File Reference
#include <cfloat>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include "atomic_ops.h"
#include "MEM_guardedalloc.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "BLI_bitmap.h"
#include "BLI_memarena.h"
#include "BLI_ordered_edge.hh"
#include "BLI_set.hh"
#include "BLI_task.h"
#include "BLI_threads.h"
#include "BLI_utildefines.h"
#include "BLI_vector.hh"
#include "BKE_ccg.hh"
#include "BKE_customdata.hh"
#include "BKE_mesh_legacy_derived_mesh.hh"
#include "BKE_mesh_mapping.hh"
#include "BKE_multires.hh"
#include "BKE_scene.hh"
#include "BKE_subsurf.hh"
#include "CCGSubSurf.h"

Go to the source code of this file.

Classes

struct  FaceVertWeightEntry
 
struct  WeightTable
 
struct  CopyFinalLoopArrayData
 

Macros

#define SUB_ELEMS_FACE   50
 

Typedefs

typedef float FaceVertWeight[SUB_ELEMS_FACE][SUB_ELEMS_FACE]
 

Enumerations

enum  CCGFlags {
  CCG_USE_AGING = 1 , CCG_USE_ARENA = 2 , CCG_CALC_NORMALS = 4 , CCG_ALLOC_MASK = 8 ,
  CCG_SIMPLE_SUBDIV = 16
}
 

Functions

static CCGDerivedMeshgetCCGDerivedMesh (CCGSubSurf *ss, int drawInteriorEdges, int useSubsurfUv, DerivedMesh *dm)
 
static void * arena_alloc (CCGAllocatorHDL a, int numBytes)
 
static void * arena_realloc (CCGAllocatorHDL a, void *ptr, int newSize, int oldSize)
 
static void arena_free (CCGAllocatorHDL, void *)
 
static void arena_release (CCGAllocatorHDL a)
 
 ENUM_OPERATORS (CCGFlags, CCG_SIMPLE_SUBDIV)
 
static CCGSubSurf_getSubSurf (CCGSubSurf *prevSS, int subdivLevels, int numLayers, CCGFlags flags)
 
static int getEdgeIndex (CCGSubSurf *ss, CCGEdge *e, int x, int edgeSize)
 
static int getFaceIndex (CCGSubSurf *ss, CCGFace *f, int S, int x, int y, int edgeSize, int gridSize)
 
static void get_face_uv_map_vert (UvVertMap *vmap, const blender::OffsetIndices< int > faces, const int *face_verts, int fi, CCGVertHDL *fverts)
 
static int ss_sync_from_uv (CCGSubSurf *ss, CCGSubSurf *origss, DerivedMesh *dm, const float(*mloopuv)[2])
 
static void set_subsurf_legacy_uv (CCGSubSurf *ss, DerivedMesh *dm, DerivedMesh *result, int n)
 
static void set_subsurf_uv (CCGSubSurf *ss, DerivedMesh *dm, DerivedMesh *result, int layer_index)
 
static floatget_ss_weights (WeightTable *wtable, int gridCuts, int faceLen)
 
static void free_ss_weights (WeightTable *wtable)
 
static void ss_sync_ccg_from_derivedmesh (CCGSubSurf *ss, DerivedMesh *dm, float(*vertexCos)[3], int useFlatSubdiv)
 
static void ss_sync_from_derivedmesh (CCGSubSurf *ss, DerivedMesh *dm, float(*vertexCos)[3], int use_flat_subdiv, bool)
 
static int ccgDM_getVertMapIndex (CCGSubSurf *ss, CCGVert *v)
 
static int ccgDM_getEdgeMapIndex (CCGSubSurf *ss, CCGEdge *e)
 
static int ccgDM_getFaceMapIndex (CCGSubSurf *ss, CCGFace *f)
 
static int ccgDM_getNumVerts (DerivedMesh *dm)
 
static int ccgDM_getNumEdges (DerivedMesh *dm)
 
static int ccgDM_getNumPolys (DerivedMesh *dm)
 
static int ccgDM_getNumLoops (DerivedMesh *dm)
 
BLI_INLINE void ccgDM_to_MVert (float mv[3], const CCGKey *key, CCGElem *elem)
 
static void ccgDM_copyFinalVertArray (DerivedMesh *dm, float(*r_positions)[3])
 
BLI_INLINE void ccgDM_to_MEdge (blender::int2 *edge, const int v1, const int v2)
 
static void ccgDM_copyFinalEdgeArray (DerivedMesh *dm, blender::int2 *edges)
 
static void copyFinalLoopArray_task_cb (void *__restrict userdata, const int iter, const TaskParallelTLS *__restrict)
 
static void ccgDM_copyFinalCornerVertArray (DerivedMesh *dm, int *r_corner_verts)
 
static void ccgDM_copyFinalCornerEdgeArray (DerivedMesh *dm, int *r_corner_edges)
 
static void ccgDM_copyFinalPolyArray (DerivedMesh *dm, int *r_face_offsets)
 
static void ccgDM_release (DerivedMesh *dm)
 
static void * ccgDM_get_vert_data_layer (DerivedMesh *dm, const eCustomDataType type)
 
static void * ccgDM_get_edge_data_layer (DerivedMesh *dm, const eCustomDataType type)
 
static void * ccgDM_get_poly_data_layer (DerivedMesh *dm, const eCustomDataType type)
 
static int ccgDM_getNumGrids (DerivedMesh *dm)
 
static int ccgDM_getGridSize (DerivedMesh *dm)
 
static void ccgdm_create_grids (DerivedMesh *dm)
 
static CCGElem ** ccgDM_getGridData (DerivedMesh *dm)
 
static intccgDM_getGridOffset (DerivedMesh *dm)
 
static void ccgDM_getGridKey (DerivedMesh *dm, CCGKey *key)
 
static void set_default_ccgdm_callbacks (CCGDerivedMesh *ccgdm)
 
static void create_ccgdm_maps (CCGDerivedMesh *ccgdm, CCGSubSurf *ss)
 
static void set_ccgdm_all_geometry (CCGDerivedMesh *ccgdm, CCGSubSurf *ss, DerivedMesh *dm, bool useSubsurfUv)
 
DerivedMeshsubsurf_make_derived_from_derived (DerivedMesh *dm, SubsurfModifierData *smd, const Scene *scene, float(*vertCos)[3], SubsurfFlags flags)
 
void subsurf_calculate_limit_positions (Mesh *mesh, float(*r_positions)[3])
 

Macro Definition Documentation

◆ SUB_ELEMS_FACE

#define SUB_ELEMS_FACE   50

Definition at line 443 of file subsurf_ccg.cc.

Typedef Documentation

◆ FaceVertWeight

typedef float FaceVertWeight[SUB_ELEMS_FACE][SUB_ELEMS_FACE]

Definition at line 444 of file subsurf_ccg.cc.

Enumeration Type Documentation

◆ CCGFlags

enum CCGFlags
Enumerator
CCG_USE_AGING 
CCG_USE_ARENA 
CCG_CALC_NORMALS 
CCG_ALLOC_MASK 
CCG_SIMPLE_SUBDIV 

Definition at line 74 of file subsurf_ccg.cc.

Function Documentation

◆ _getSubSurf()

◆ arena_alloc()

static void * arena_alloc ( CCGAllocatorHDL a,
int numBytes )
static

Definition at line 50 of file subsurf_ccg.cc.

References BLI_memarena_alloc().

Referenced by _getSubSurf().

◆ arena_free()

static void arena_free ( CCGAllocatorHDL ,
void *  )
static

Definition at line 64 of file subsurf_ccg.cc.

Referenced by _getSubSurf().

◆ arena_realloc()

static void * arena_realloc ( CCGAllocatorHDL a,
void * ptr,
int newSize,
int oldSize )
static

Definition at line 55 of file subsurf_ccg.cc.

References BLI_memarena_alloc(), and ptr.

Referenced by _getSubSurf().

◆ arena_release()

static void arena_release ( CCGAllocatorHDL a)
static

Definition at line 69 of file subsurf_ccg.cc.

References BLI_memarena_free().

Referenced by _getSubSurf().

◆ ccgDM_copyFinalCornerEdgeArray()

◆ ccgDM_copyFinalCornerVertArray()

◆ ccgDM_copyFinalEdgeArray()

◆ ccgDM_copyFinalPolyArray()

static void ccgDM_copyFinalPolyArray ( DerivedMesh * dm,
int * r_face_offsets )
static

◆ ccgDM_copyFinalVertArray()

◆ ccgdm_create_grids()

◆ ccgDM_get_edge_data_layer()

◆ ccgDM_get_poly_data_layer()

◆ ccgDM_get_vert_data_layer()

◆ ccgDM_getEdgeMapIndex()

static int ccgDM_getEdgeMapIndex ( CCGSubSurf * ss,
CCGEdge * e )
static

Definition at line 633 of file subsurf_ccg.cc.

References ccgSubSurf_getEdgeUserData(), and e.

Referenced by ccgDM_get_edge_data_layer(), and set_ccgdm_all_geometry().

◆ ccgDM_getFaceMapIndex()

static int ccgDM_getFaceMapIndex ( CCGSubSurf * ss,
CCGFace * f )
static

Definition at line 638 of file subsurf_ccg.cc.

References ccgSubSurf_getFaceUserData().

Referenced by ccgDM_get_poly_data_layer().

◆ ccgDM_getGridData()

static CCGElem ** ccgDM_getGridData ( DerivedMesh * dm)
static

Definition at line 1187 of file subsurf_ccg.cc.

References ccgdm_create_grids(), and CCGDerivedMesh::gridData.

Referenced by set_default_ccgdm_callbacks().

◆ ccgDM_getGridKey()

static void ccgDM_getGridKey ( DerivedMesh * dm,
CCGKey * key )
static

Definition at line 1203 of file subsurf_ccg.cc.

References CCG_key_top_level(), and CCGDerivedMesh::ss.

Referenced by set_default_ccgdm_callbacks().

◆ ccgDM_getGridOffset()

static int * ccgDM_getGridOffset ( DerivedMesh * dm)
static

Definition at line 1195 of file subsurf_ccg.cc.

References ccgdm_create_grids(), and CCGDerivedMesh::gridOffset.

Referenced by set_default_ccgdm_callbacks().

◆ ccgDM_getGridSize()

static int ccgDM_getGridSize ( DerivedMesh * dm)
static

Definition at line 1129 of file subsurf_ccg.cc.

References ccgSubSurf_getGridSize(), and CCGDerivedMesh::ss.

Referenced by set_default_ccgdm_callbacks().

◆ ccgDM_getNumEdges()

static int ccgDM_getNumEdges ( DerivedMesh * dm)
static

Definition at line 650 of file subsurf_ccg.cc.

References ccgSubSurf_getNumFinalEdges(), and CCGDerivedMesh::ss.

Referenced by set_default_ccgdm_callbacks().

◆ ccgDM_getNumGrids()

◆ ccgDM_getNumLoops()

static int ccgDM_getNumLoops ( DerivedMesh * dm)
static

Definition at line 664 of file subsurf_ccg.cc.

References ccgSubSurf_getNumFinalFaces(), and CCGDerivedMesh::ss.

Referenced by set_default_ccgdm_callbacks().

◆ ccgDM_getNumPolys()

static int ccgDM_getNumPolys ( DerivedMesh * dm)
static

Definition at line 657 of file subsurf_ccg.cc.

References ccgSubSurf_getNumFinalFaces(), and CCGDerivedMesh::ss.

Referenced by set_default_ccgdm_callbacks().

◆ ccgDM_getNumVerts()

static int ccgDM_getNumVerts ( DerivedMesh * dm)
static

Definition at line 643 of file subsurf_ccg.cc.

References ccgSubSurf_getNumFinalVerts(), and CCGDerivedMesh::ss.

Referenced by set_default_ccgdm_callbacks().

◆ ccgDM_getVertMapIndex()

static int ccgDM_getVertMapIndex ( CCGSubSurf * ss,
CCGVert * v )
static

Definition at line 628 of file subsurf_ccg.cc.

References ccgSubSurf_getVertUserData(), and v.

Referenced by ccgDM_get_vert_data_layer(), and set_ccgdm_all_geometry().

◆ ccgDM_release()

◆ ccgDM_to_MEdge()

BLI_INLINE void ccgDM_to_MEdge ( blender::int2 * edge,
const int v1,
const int v2 )

Definition at line 741 of file subsurf_ccg.cc.

References v2.

Referenced by ccgDM_copyFinalEdgeArray().

◆ ccgDM_to_MVert()

BLI_INLINE void ccgDM_to_MVert ( float mv[3],
const CCGKey * key,
CCGElem * elem )

Definition at line 673 of file subsurf_ccg.cc.

References CCG_elem_co(), and copy_v3_v3().

Referenced by ccgDM_copyFinalVertArray().

◆ copyFinalLoopArray_task_cb()

◆ create_ccgdm_maps()

◆ ENUM_OPERATORS()

ENUM_OPERATORS ( CCGFlags ,
CCG_SIMPLE_SUBDIV  )

◆ free_ss_weights()

static void free_ss_weights ( WeightTable * wtable)
static

◆ get_face_uv_map_vert()

static void get_face_uv_map_vert ( UvVertMap * vmap,
const blender::OffsetIndices< int > faces,
const int * face_verts,
int fi,
CCGVertHDL * fverts )
static

◆ get_ss_weights()

static float * get_ss_weights ( WeightTable * wtable,
int gridCuts,
int faceLen )
static

◆ getCCGDerivedMesh()

◆ getEdgeIndex()

static int getEdgeIndex ( CCGSubSurf * ss,
CCGEdge * e,
int x,
int edgeSize )
static

◆ getFaceIndex()

◆ set_ccgdm_all_geometry()

static void set_ccgdm_all_geometry ( CCGDerivedMesh * ccgdm,
CCGSubSurf * ss,
DerivedMesh * dm,
bool useSubsurfUv )
static

Definition at line 1278 of file subsurf_ccg.cc.

References BLI_assert, ccgDM_getEdgeMapIndex(), ccgDM_getVertMapIndex(), ccgSubSurf_getEdgeEdgeHandle(), ccgSubSurf_getEdgeSize(), ccgSubSurf_getEdgeUserData(), ccgSubSurf_getEdgeVert0(), ccgSubSurf_getEdgeVert1(), ccgSubSurf_getFaceFaceHandle(), ccgSubSurf_getFaceNumVerts(), ccgSubSurf_getFaceUserData(), ccgSubSurf_getFaceVert(), ccgSubSurf_getGridSize(), ccgSubSurf_getNumEdges(), ccgSubSurf_getNumFaces(), ccgSubSurf_getNumFinalEdges(), ccgSubSurf_getNumFinalFaces(), ccgSubSurf_getNumFinalVerts(), ccgSubSurf_getNumVerts(), ccgSubSurf_getVertUserData(), ccgSubSurf_getVertVertHandle(), CD_ORIGINDEX, CD_PROP_FLOAT2, CustomData_copy_data(), CustomData_get_layer(), CustomData_interp(), CustomData_number_of_layers(), blender::Vector< T, InlineBufferCapacity, Allocator >::data(), CCGDerivedMesh::dm, DM_copy_vert_data(), DM_get_edge_data_layer(), DM_get_poly_data_layer(), DM_get_vert_data_layer(), DM_interp_vert_data(), e, CCGDerivedMesh::edge, DerivedMesh::edgeData, CCGDerivedMesh::edgeMap, CCGDerivedMesh::face, CCGDerivedMesh::faceMap, float, free_ss_weights(), get_ss_weights(), getNumEdges(), DerivedMesh::loopData, ORIGINDEX_NONE, POINTER_AS_INT, DerivedMesh::polyData, blender::Vector< T, InlineBufferCapacity, Allocator >::reinitialize(), set_subsurf_uv(), CCGDerivedMesh::ss, CCGDerivedMesh::startEdge, CCGDerivedMesh::startFace, CCGDerivedMesh::startVert, CustomData::totlayer, v, CCGDerivedMesh::vert, CCGDerivedMesh::vertMap, w(), x, and y.

Referenced by getCCGDerivedMesh().

◆ set_default_ccgdm_callbacks()

◆ set_subsurf_legacy_uv()

◆ set_subsurf_uv()

static void set_subsurf_uv ( CCGSubSurf * ss,
DerivedMesh * dm,
DerivedMesh * result,
int layer_index )
static

Definition at line 437 of file subsurf_ccg.cc.

References set_subsurf_legacy_uv().

Referenced by set_ccgdm_all_geometry().

◆ ss_sync_ccg_from_derivedmesh()

◆ ss_sync_from_derivedmesh()

static void ss_sync_from_derivedmesh ( CCGSubSurf * ss,
DerivedMesh * dm,
float(*) vertexCos[3],
int use_flat_subdiv,
bool  )
static

◆ ss_sync_from_uv()

◆ subsurf_calculate_limit_positions()

◆ subsurf_make_derived_from_derived()