51 if (tan_layers == 0 && use_orco_tan &&
59 const Span<int> corner_tri_faces = mr.
mesh->corner_tri_faces();
63 if (tan_layers & (1 << i)) {
68 SNPRINTF(attr_name,
"t%s", attr_safe_name);
79 STRNCPY(r_tangent_names[tan_len++], layer_name);
82 if (use_orco_tan && orco.
is_empty()) {
102 orco = orco_allocated;
107 if (tan_len != 0 || use_orco_tan) {
108 short tangent_mask = 0;
109 bool calc_active_tangent =
false;
127 corner_tri_faces.
data(),
148 SNPRINTF(attr_name,
"t%s", attr_safe_name);
155 if (
format->attr_len == 0) {
161 *r_use_orco_tan = use_orco_tan;
163 *r_tan_len = tan_len;
196 for (
int i = 0; i < tan_len; i++) {
197 const char *name = tangent_names[i];
200 for (
int corner = 0; corner < mr.
corners_num; corner++) {
202 (*tan_data)[3] = (layer_data[corner][3] > 0.0f) ? SHRT_MAX : SHRT_MIN;
209 for (
int corner = 0; corner < mr.
corners_num; corner++) {
211 (*tan_data)[3] = (layer_data[corner][3] > 0.0f) ? SHRT_MAX : SHRT_MIN;
218 for (
int i = 0; i < tan_len; i++) {
219 const char *name = tangent_names[i];
222 for (
int corner = 0; corner < mr.
corners_num; corner++) {
224 tan_data->
w = (layer_data[corner][3] > 0.0f) ? 1 : -2;
231 for (
int corner = 0; corner < mr.
corners_num; corner++) {
233 tan_data->
w = (layer_data[corner][3] > 0.0f) ? 1 : -2;
245 if (
format.attr_len == 0) {
284 int pack_layer_index = 0;
285 for (
int i = 0; i < tan_len; i++) {
287 const char *name = tangent_names[i];
290 for (
int corner = 0; corner < mr.
corners_num; corner++) {
292 (*tan_data)[3] = (layer_data[corner][3] > 0.0f) ? 1.0f : -1.0f;
306 for (
int corner = 0; corner < mr.
corners_num; corner++) {
308 (*tan_data)[3] = (layer_data[corner][3] > 0.0f) ? 1.0f : -1.0f;
const void * CustomData_get_layer_n(const CustomData *data, eCustomDataType type, int n)
const void * CustomData_get_layer(const CustomData *data, eCustomDataType type)
const void * CustomData_get_layer_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
void CustomData_reset(CustomData *data)
const char * CustomData_get_layer_name(const CustomData *data, eCustomDataType type, int n)
int CustomData_get_layer_index(const CustomData *data, eCustomDataType type)
void CustomData_free(CustomData *data, int totelem)
int CustomData_get_active_layer(const CustomData *data, eCustomDataType type)
int CustomData_get_render_layer(const CustomData *data, eCustomDataType type)
void BKE_editmesh_loop_tangent_calc(BMEditMesh *em, bool calc_active_tangent, const char(*tangent_names)[MAX_CUSTOMDATA_LAYER_NAME], int tangent_names_len, blender::Span< blender::float3 > face_normals, blender::Span< blender::float3 > corner_normals, blender::Span< blender::float3 > vert_orco, CustomData *dm_loopdata_out, uint dm_loopdata_out_len, short *tangent_mask_curr_p)
void BKE_mesh_orco_verts_transform(Mesh *mesh, blender::MutableSpan< blender::float3 > orco, bool invert)
void BKE_mesh_calc_loop_tangent_ex(blender::Span< blender::float3 > vert_positions, blender::OffsetIndices< int > faces, const int *corner_verts, const blender::int3 *corner_tris, const int *corner_tri_faces, uint corner_tris_len, const blender::Span< bool > sharp_faces, const CustomData *loopdata, bool calc_active_tangent, const char(*tangent_names)[MAX_CUSTOMDATA_LAYER_NAME], int tangent_names_len, blender::Span< blender::float3 > vert_normals, blender::Span< blender::float3 > face_normals, blender::Span< blender::float3 > corner_normals, blender::Span< blender::float3 > vert_orco, CustomData *loopdata_out, uint loopdata_out_len, short *tangent_mask_curr_p)
MINLINE void normal_float_to_short_v3(short out[3], const float in[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
#define STRNCPY(dst, src)
#define SNPRINTF(dst, format,...)
#define MAX_CUSTOMDATA_LAYER_NAME
void GPU_vertbuf_init_build_on_device(blender::gpu::VertBuf &verts, const GPUVertFormat &format, uint v_len)
void GPU_vertbuf_tag_dirty(blender::gpu::VertBuf *verts)
#define GPU_vertbuf_init_with_format(verts, format)
blender::gpu::VertBuf * GPU_vertbuf_calloc()
void GPU_vertbuf_data_alloc(blender::gpu::VertBuf &verts, uint v_len)
void GPU_vertbuf_init_with_format_ex(blender::gpu::VertBuf &verts, const GPUVertFormat &format, GPUUsageType)
void GPU_vertbuf_discard(blender::gpu::VertBuf *)
Read Guarded memory(de)allocation.
ATTR_WARN_UNUSED_RESULT BMesh * bm
BLI_INLINE BMVert * BM_vert_at_index(BMesh *bm, const int index)
ATTR_WARN_UNUSED_RESULT const BMVert * v
void reinitialize(const int64_t new_size)
constexpr const T * data() const
constexpr int64_t size() const
constexpr bool is_empty() const
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void extract_tangents(const MeshRenderData &mr, const MeshBatchCache &cache, const bool use_hq, gpu::VertBuf &vbo)
static const GPUVertFormat & get_coarse_tan_format()
static void extract_tan_init_common(const MeshRenderData &mr, const MeshBatchCache &cache, GPUVertFormat *format, GPUVertCompType comp_type, GPUVertFetchMode fetch_mode, CustomData *r_loop_data, int *r_v_len, int *r_tan_len, char r_tangent_names[MAX_MTFACE][MAX_CUSTOMDATA_LAYER_NAME], bool *r_use_orco_tan)
void extract_tangents_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, const MeshBatchCache &cache, gpu::VertBuf &vbo)
void draw_subdiv_interp_custom_data(const DRWSubdivCache &cache, gpu::VertBuf &src_data, gpu::VertBuf &dst_data, int comp_type, int dimensions, int dst_offset)
Span< float3 > vert_positions
VArraySpan< bool > sharp_faces
eMRExtractType extract_type
Span< float3 > bm_face_normals
Span< float3 > face_normals
Span< float3 > corner_normals
OffsetIndices< int > faces
Array< float3 > bm_loop_normals