35#define USE_LOOPTRI_DETECT_QUADS
40#ifdef USE_LOOPTRI_DETECT_QUADS
49#ifdef USE_LOOPTRI_DETECT_QUADS
68#ifdef USE_LOOPTRI_DETECT_QUADS
71 if (ltri[0]->f->len == 4) {
73 while (vert_index--) {
86 return ltri[vert_index];
124 const uint vert_index,
130 copy_v4_fl4(p_res, T.x, T.y, T.z, orientation ? 1.0f : -1.0f);
141#ifdef USE_LOOPTRI_DETECT_QUADS
158 bool calc_active_tangent,
160 int tangent_names_len,
166 const uint loopdata_out_len,
167 short *tangent_mask_curr_p)
173 bool calc_act =
false;
174 bool calc_ren =
false;
177 short tangent_mask = 0;
178 short tangent_mask_curr = *tangent_mask_curr_p;
192 if ((tangent_mask_curr | tangent_mask) != tangent_mask_curr) {
193 for (
int i = 0; i < tangent_names_len; i++) {
194 if (tangent_names[i][0]) {
196 &
bm->
ldata, loopdata_out,
int(loopdata_out_len), tangent_names[i]);
205 if (calc_act && act_uv_name[0]) {
207 &
bm->
ldata, loopdata_out,
int(loopdata_out_len), act_uv_name);
209 if (calc_ren && ren_uv_name[0]) {
211 &
bm->
ldata, loopdata_out,
int(loopdata_out_len), ren_uv_name);
214#ifdef USE_LOOPTRI_DETECT_QUADS
215 int num_face_as_quad_map;
216 int *face_as_quad_map =
nullptr;
223 face_as_quad_map =
static_cast<int *
>(
MEM_mallocN(
sizeof(
int) * totface, __func__));
225 for (i = 0, j = 0; j < totface; i++, j++) {
226 face_as_quad_map[i] = j;
228 if (em->
looptris[j][0]->f->len == 4) {
232 num_face_as_quad_map = i;
235 num_face_as_quad_map = totface;
243 tangent_mask_curr = 0;
250 for (n = 0; n < tangent_layer_num; n++) {
255#ifdef USE_LOOPTRI_DETECT_QUADS
268 mesh2tangent->
orco = vert_orco;
269 if (mesh2tangent->
orco.is_empty()) {
283 tangent_mask_curr |= 1 << (uv_ind - uv_start);
292 mesh2tangent->
tangent =
static_cast<float(*)[4]
>(loopdata_out->
layers[index].
data);
298 BLI_assert(tangent_mask_curr == tangent_mask);
303 tangent_mask_curr = tangent_mask;
305#ifdef USE_LOOPTRI_DETECT_QUADS
306 if (face_as_quad_map) {
309# undef USE_LOOPTRI_DETECT_QUADS
313 *tangent_mask_curr_p = tangent_mask_curr;
316 if (act_uv_index >= 0) {
324 if (ren_uv_index >= 0) {
CustomData interface, see also DNA_customdata_types.h.
int CustomData_get_layer_index_n(const CustomData *data, eCustomDataType type, int n)
void CustomData_set_layer_render_index(CustomData *data, eCustomDataType type, int n)
int CustomData_get_n_offset(const CustomData *data, eCustomDataType type, int n)
void * CustomData_add_layer_named(CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem, blender::StringRef name)
int CustomData_get_named_layer_index(const CustomData *data, eCustomDataType type, blender::StringRef name)
int CustomData_get_layer_index(const CustomData *data, eCustomDataType type)
void CustomData_update_typemap(CustomData *data)
void CustomData_set_layer_active_index(CustomData *data, eCustomDataType type, int n)
int CustomData_number_of_layers(const CustomData *data, eCustomDataType type)
void BKE_mesh_add_loop_tangent_named_layer_for_uv(const CustomData *uv_data, CustomData *tan_data, int numLoopData, const char *layer_name)
#define DM_TANGENT_MASK_ORCO
void BKE_mesh_calc_loop_tangent_step_0(const CustomData *loopData, bool calc_active_tangent, const char(*tangent_names)[MAX_CUSTOMDATA_LAYER_NAME], 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)
bool map_to_sphere(float *r_u, float *r_v, float x, float y, float z)
MINLINE void copy_v4_fl4(float v[4], float x, float y, float z, float w)
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)
#define MAX_CUSTOMDATA_LAYER_NAME
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
ATTR_WARN_UNUSED_RESULT const BMVert * v
void BKE_editmesh_loop_tangent_calc(BMEditMesh *em, bool calc_active_tangent, const char(*tangent_names)[MAX_CUSTOMDATA_LAYER_NAME], int tangent_names_len, const Span< float3 > face_normals, const Span< float3 > corner_normals, const Span< float3 > vert_orco, CustomData *loopdata_out, const uint loopdata_out_len, short *tangent_mask_curr_p)
static void emDM_calc_loop_tangents_thread(TaskPool *__restrict, void *taskdata)
draw_view in_light_buf[] float
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
blender::Array< std::array< BMLoop *, 3 > > looptris
Span< float3 > face_normals
Span< float3 > corner_normals
mikk::float3 GetNormal(const uint face_num, const uint vert_index)
mikk::float3 GetPosition(const uint face_num, const uint vert_index)
mikk::float3 GetTexCoord(const uint face_num, const uint vert_index)
const BMLoop * GetLoop(const uint face_num, uint vert_index)
const int * face_as_quad_map
Span< std::array< BMLoop *, 3 > > looptris
uint GetNumVerticesOfFace(const uint face_num)
void SetTangentSpace(const uint face_num, const uint vert_index, mikk::float3 T, bool orientation)