36#define USE_LOOPTRI_DETECT_QUADS
41#ifdef USE_LOOPTRI_DETECT_QUADS
50#ifdef USE_LOOPTRI_DETECT_QUADS
69#ifdef USE_LOOPTRI_DETECT_QUADS
72 if (ltri[0]->f->len == 4) {
74 while (vert_index--) {
87 return ltri[vert_index];
125 const uint vert_index,
147#ifdef USE_LOOPTRI_DETECT_QUADS
156 BMEditMesh *&em,
BMesh *&
bm,
int &totface,
int &num_face_as_quad_map,
int *&face_as_quad_map)
158#ifdef USE_LOOPTRI_DETECT_QUADS
165 for (
i = 0, j = 0; j < totface;
i++, j++) {
166 face_as_quad_map[
i] = j;
168 if (em->
looptris[j][0]->f->len == 4) {
172 num_face_as_quad_map =
i;
175 num_face_as_quad_map = totface;
178 num_face_as_quad_map = totface;
179 face_as_quad_map =
nullptr;
196 int num_face_as_quad_map;
197 int *face_as_quad_map =
nullptr;
211 for (const int n : range) {
212 SGLSLEditMeshToTangent mesh2tangent{};
213 mesh2tangent.numTessFaces = em->looptris.size();
214 mesh2tangent.face_as_quad_map = face_as_quad_map;
215 mesh2tangent.num_face_as_quad_map = num_face_as_quad_map;
216 mesh2tangent.face_normals = face_normals;
219 mesh2tangent.corner_normals = corner_normals;
220 mesh2tangent.cd_loop_uv_offset = CustomData_get_offset_named(
221 &bm->ldata, CD_PROP_FLOAT2, uv_names[n]);
222 BLI_assert(mesh2tangent.cd_loop_uv_offset != -1);
224 mesh2tangent.looptris = em->looptris;
225 result[n].reinitialize(bm->totloop);
226 mesh2tangent.tangent = reinterpret_cast<float (*)[4]>(result[n].data());
228 mikk::Mikktspace<SGLSLEditMeshToTangent> mikk(mesh2tangent);
250 int num_face_as_quad_map;
251 int *face_as_quad_map =
nullptr;
275 mesh2tangent.
orco = vert_orco;
278 mesh2tangent.
tangent =
reinterpret_cast<float (*)[4]
>(
result.data());
CustomData interface, see also DNA_customdata_types.h.
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)
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)
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
constexpr int64_t size() const
constexpr IndexRange index_range() const
constexpr bool is_empty() const
Array< Array< float4 > > BKE_editmesh_uv_tangents_calc(BMEditMesh *em, const Span< float3 > face_normals, const Span< float3 > corner_normals, const Span< StringRef > uv_names)
Array< float4 > BKE_editmesh_orco_tangents_calc(BMEditMesh *em, const Span< float3 > face_normals, const Span< float3 > corner_normals, const Span< float3 > vert_orco)
static void calc_face_as_quad_map(BMEditMesh *&em, BMesh *&bm, int &totface, int &num_face_as_quad_map, int *&face_as_quad_map)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
VecBase< float, 4 > float4
VecBase< float, 3 > float3
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)