30 #define USE_LOOPTRI_DETECT_QUADS
33 const float (*precomputedFaceNormals)[3];
34 const float (*precomputedLoopNormals)[3];
41 #ifdef USE_LOOPTRI_DETECT_QUADS
50 #ifdef USE_LOOPTRI_DETECT_QUADS
55 while (vert_index--) {
66 #ifdef USE_LOOPTRI_DETECT_QUADS
75 #ifdef USE_LOOPTRI_DETECT_QUADS
79 if (lt[0]->f->len == 4) {
100 #ifdef USE_LOOPTRI_DETECT_QUADS
103 if (lt[0]->f->len == 4) {
127 const int vert_index)
134 #ifdef USE_LOOPTRI_DETECT_QUADS
137 if (lt[0]->f->len == 4) {
158 map_to_sphere(&r_uv[0], &r_uv[1], orco[0], orco[1], orco[2]);
165 const int vert_index)
172 #ifdef USE_LOOPTRI_DETECT_QUADS
175 if (lt[0]->f->len == 4) {
207 const float fvTangent[3],
210 const int vert_index)
217 #ifdef USE_LOOPTRI_DETECT_QUADS
220 if (lt[0]->f->len == 4) {
263 bool calc_active_tangent,
264 const char (*tangent_names)[
MAX_NAME],
265 int tangent_names_len,
266 const float (*poly_normals)[3],
267 const float (*loop_normals)[3],
268 const float (*vert_orco)[3],
271 const uint loopdata_out_len,
272 short *tangent_mask_curr_p)
278 bool calc_act =
false;
279 bool calc_ren =
false;
282 short tangent_mask = 0;
283 short tangent_mask_curr = *tangent_mask_curr_p;
297 if ((tangent_mask_curr | tangent_mask) != tangent_mask_curr) {
298 for (
int i = 0; i < tangent_names_len; i++) {
299 if (tangent_names[i][0]) {
301 &
bm->
ldata, loopdata_out, (
int)loopdata_out_len, tangent_names[i]);
309 if (calc_act && act_uv_name[0]) {
311 &
bm->
ldata, loopdata_out, (
int)loopdata_out_len, act_uv_name);
313 if (calc_ren && ren_uv_name[0]) {
315 &
bm->
ldata, loopdata_out, (
int)loopdata_out_len, ren_uv_name);
318 #ifdef USE_LOOPTRI_DETECT_QUADS
329 for (i = 0, j = 0; j < totface; i++, j++) {
347 tangent_mask_curr = 0;
354 for (n = 0; n < tangent_layer_num; n++) {
359 #ifdef USE_LOOPTRI_DETECT_QUADS
372 mesh2tangent->
orco = vert_orco;
373 if (!mesh2tangent->
orco) {
387 tangent_mask_curr |= 1 << (uv_ind - uv_start);
401 BLI_assert(tangent_mask_curr == tangent_mask);
406 tangent_mask_curr = tangent_mask;
408 #ifdef USE_LOOPTRI_DETECT_QUADS
412 # undef USE_LOOPTRI_DETECT_QUADS
416 *tangent_mask_curr_p = tangent_mask_curr;
419 if (act_uv_index >= 0) {
427 if (ren_uv_index >= 0) {
typedef float(TangentPoint)[2]
CustomData interface, see also DNA_customdata_types.h.
int CustomData_number_of_layers(const struct CustomData *data, int type)
int CustomData_get_named_layer_index(const struct CustomData *data, int type, const char *name)
void CustomData_set_layer_render_index(struct CustomData *data, int type, int n)
int CustomData_get_layer_index_n(const struct CustomData *data, int type, int n)
void * CustomData_add_layer_named(struct CustomData *data, int type, eCDAllocType alloctype, void *layer, int totelem, const char *name)
int CustomData_get_layer_index(const struct CustomData *data, int type)
void CustomData_set_layer_active_index(struct CustomData *data, int type, int n)
int CustomData_get_n_offset(const struct CustomData *data, int type, int n)
void CustomData_update_typemap(struct CustomData *data)
#define DM_TANGENT_MASK_ORCO
void BKE_mesh_add_loop_tangent_named_layer_for_uv(struct CustomData *uv_data, struct CustomData *tan_data, int numLoopData, const char *layer_name)
void BKE_mesh_calc_loop_tangent_step_0(const struct CustomData *loopData, bool calc_active_tangent, const char(*tangent_names)[64], int tangent_names_count, bool *rcalc_act, bool *rcalc_ren, int *ract_uv_n, int *rren_uv_n, char *ract_uv_name, char *rren_uv_name, short *rtangent_mask)
void map_to_sphere(float *r_u, float *r_v, float x, float y, float z)
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void copy_v3_v3(float r[3], const float a[3])
void BLI_task_pool_work_and_wait(TaskPool *pool)
TaskPool * BLI_task_pool_create(void *userdata, eTaskPriority priority)
void BLI_task_pool_free(TaskPool *pool)
void BLI_task_pool_push(TaskPool *pool, TaskRunFunction run, void *taskdata, bool free_taskdata, TaskFreeFunction freedata)
Read Guarded memory(de)allocation.
#define BM_FACE_FIRST_LOOP(p)
#define BM_ELEM_CD_GET_VOID_P(ele, offset)
#define BM_elem_index_get(ele)
#define BM_elem_flag_test(ele, hflag)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
ATTR_WARN_UNUSED_RESULT const BMLoop * l
static int emdm_ts_GetNumFaces(const SMikkTSpaceContext *pContext)
static void emDM_calc_loop_tangents_thread(TaskPool *__restrict UNUSED(pool), void *taskdata)
void BKE_editmesh_loop_tangent_calc(BMEditMesh *em, bool calc_active_tangent, const char(*tangent_names)[MAX_NAME], int tangent_names_len, const float(*poly_normals)[3], const float(*loop_normals)[3], const float(*vert_orco)[3], CustomData *loopdata_out, const uint loopdata_out_len, short *tangent_mask_curr_p)
static void emdm_ts_GetNormal(const SMikkTSpaceContext *pContext, float r_no[3], const int face_num, const int vert_index)
static int emdm_ts_GetNumVertsOfFace(const SMikkTSpaceContext *pContext, const int face_num)
static const BMLoop * bm_loop_at_face_index(const BMFace *f, int vert_index)
static void emdm_ts_GetTextureCoordinate(const SMikkTSpaceContext *pContext, float r_uv[2], const int face_num, const int vert_index)
static void emdm_ts_SetTSpace(const SMikkTSpaceContext *pContext, const float fvTangent[3], const float fSign, const int face_num, const int vert_index)
static void emdm_ts_GetPosition(const SMikkTSpaceContext *pContext, float r_co[3], const int face_num, const int vert_index)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_mallocN)(size_t len, const char *str)
tbool genTangSpaceDefault(const SMikkTSpaceContext *pContext)
struct BMLoop *(* looptris)[3]
const float(* precomputedFaceNormals)[3]
const BMLoop *(* looptris)[3]
const int * face_as_quad_map
const float(* precomputedLoopNormals)[3]
SMikkTSpaceInterface * m_pInterface
void(* m_getNormal)(const SMikkTSpaceContext *pContext, float fvNormOut[], const int iFace, const int iVert)
void(* m_getPosition)(const SMikkTSpaceContext *pContext, float fvPosOut[], const int iFace, const int iVert)
void(* m_getTexCoord)(const SMikkTSpaceContext *pContext, float fvTexcOut[], const int iFace, const int iVert)
void(* m_setTSpaceBasic)(const SMikkTSpaceContext *pContext, const float fvTangent[], const float fSign, const int iFace, const int iVert)
int(* m_getNumFaces)(const SMikkTSpaceContext *pContext)
int(* m_getNumVerticesOfFace)(const SMikkTSpaceContext *pContext, const int iFace)