40 if (tan_layers == 0 && use_orco_tan &&
57 if (
const float3 *orco_ptr =
static_cast<const float3 *
>(
66 orco = orco_allocated;
71 mr.
mesh->corner_tris(),
72 mr.
mesh->corner_tri_faces(),
74 mr.
mesh->vert_normals(),
82 SNPRINTF(attr_name,
"t%s", attr_safe_name);
87 return {std::move(tangents)};
92 if (tan_layers & (1 <<
i)) {
97 SNPRINTF(attr_name,
"t%s", attr_safe_name);
108 uv_names.
append(layer_name);
128 uv_map_spans[
i] = uv_maps[
i];
133 mr.
mesh->corner_tris(),
134 mr.
mesh->corner_tri_faces(),
136 mr.
mesh->vert_normals(),
142 if (
format->attr_len == 0) {
153 gpu::VertAttrType gpu_attr_type = use_hq ? gpu::VertAttrType::SNORM_16_16_16_16 :
154 gpu::VertAttrType::SNORM_10_10_10_2;
167 for (
int corner = 0; corner < mr.
corners_num; corner++) {
169 tan_data[vbo_index].w = (layer_data[corner][3] > 0.0f) ? SHRT_MAX : SHRT_MIN;
180 for (
int corner = 0; corner < mr.
corners_num; corner++) {
182 tan_data[vbo_index].w = (layer_data[corner][3] > 0.0f) ? 1 : -2;
195 "tan", gpu::VertAttrType::SFLOAT_32_32_32_32);
217 int pack_layer_index = 0;
221 for (
int corner = 0; corner < mr.
corners_num; corner++) {
222 *tan_data = values[corner];
223 (*tan_data)[3] = (values[corner][3] > 0.0f) ? 1.0f : -1.0f;
230 const int dst_offset = int(subdiv_cache.
num_subdiv_loops) * 4 * pack_layer_index++;
const void * CustomData_get_layer(const CustomData *data, eCustomDataType type)
const char * CustomData_get_layer_name(const CustomData *data, eCustomDataType type, int n)
int CustomData_get_layer_index(const CustomData *data, eCustomDataType type)
int CustomData_get_active_layer(const CustomData *data, eCustomDataType type)
int CustomData_get_render_layer(const CustomData *data, eCustomDataType type)
blender::Array< blender::float4 > BKE_editmesh_orco_tangents_calc(BMEditMesh *em, blender::Span< blender::float3 > face_normals, blender::Span< blender::float3 > corner_normals, blender::Span< blender::float3 > vert_orco)
blender::Array< blender::Array< blender::float4 > > BKE_editmesh_uv_tangents_calc(BMEditMesh *em, blender::Span< blender::float3 > face_normals, blender::Span< blender::float3 > corner_normals, blender::Span< blender::StringRef > uv_names)
void BKE_mesh_orco_verts_transform(Mesh *mesh, blender::MutableSpan< blender::float3 > orco, bool invert)
#define SNPRINTF(dst, format,...)
blender::gpu::VertBuf * GPU_vertbuf_create_on_device(const GPUVertFormat &format, uint v_len)
void GPU_vertbuf_tag_dirty(blender::gpu::VertBuf *verts)
static blender::gpu::VertBuf * GPU_vertbuf_create_with_format(const GPUVertFormat &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 *)
BMesh const char void * data
Array< float3 > BM_mesh_vert_coords_alloc(BMesh *bm)
IndexRange index_range() const
constexpr int64_t size() const
constexpr T * data() const
void append(const T &value)
IndexRange index_range() const
GAttributeReader lookup(const StringRef attribute_id) const
Array< float4 > calc_orco_tangents(Span< float3 > vert_positions, OffsetIndices< int > faces, Span< int > corner_verts, Span< int3 > corner_tris, Span< int > corner_tri_faces, Span< bool > sharp_faces, Span< float3 > vert_normals, Span< float3 > face_normals, Span< float3 > corner_normals, Span< float3 > vert_orco)
Array< Array< float4 > > calc_uv_tangents(Span< float3 > vert_positions, OffsetIndices< int > faces, Span< int > corner_verts, Span< int3 > corner_tris, Span< int > corner_tri_faces, Span< bool > sharp_faces, Span< float3 > vert_normals, Span< float3 > face_normals, Span< float3 > corner_normals, Span< Span< float2 > > uv_maps)
gpu::VertBufPtr extract_tangents_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, const MeshBatchCache &cache)
void draw_subdiv_interp_custom_data(const DRWSubdivCache &cache, gpu::VertBuf &src_data, gpu::VertBuf &dst_data, GPUVertCompType comp_type, int dimensions, int dst_offset)
gpu::VertBufPtr extract_tangents(const MeshRenderData &mr, const MeshBatchCache &cache, bool use_hq)
static Array< Array< float4 > > extract_tan_init_common(const MeshRenderData &mr, const MeshBatchCache &cache, GPUVertFormat *format, gpu::VertAttrType gpu_attr_type)
static const GPUVertFormat & get_coarse_tan_format()
GPUType convert_normal(const float3 &src)
std::unique_ptr< gpu::VertBuf, gpu::VertBufDeleter > VertBufPtr
blender::VecBase< int16_t, 4 > short4
VecBase< float, 4 > float4
VecBase< float, 2 > float2
VecBase< float, 3 > float3
Span< float3 > vert_positions
MeshExtractType extract_type
VArraySpan< bool > sharp_faces
Span< float3 > bm_face_normals
Span< float3 > face_normals
Span< float3 > corner_normals
OffsetIndices< int > faces
Array< float3 > bm_loop_normals