Blender  V3.3
Classes
mesh_tangent.c File Reference
#include <limits.h>
#include "MEM_guardedalloc.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "BLI_math.h"
#include "BLI_task.h"
#include "BLI_utildefines.h"
#include "BKE_customdata.h"
#include "BKE_mesh.h"
#include "BKE_mesh_runtime.h"
#include "BKE_mesh_tangent.h"
#include "BKE_report.h"
#include "BLI_strict_flags.h"
#include "atomic_ops.h"
#include "mikktspace.h"

Go to the source code of this file.

Classes

struct  BKEMeshToTangent
 
struct  SGLSLMeshToTangent
 

Functions

Mesh Tangent Calculations (Single Layer)
static int get_num_faces (const SMikkTSpaceContext *pContext)
 
static int get_num_verts_of_face (const SMikkTSpaceContext *pContext, const int face_idx)
 
static void get_position (const SMikkTSpaceContext *pContext, float r_co[3], const int face_idx, const int vert_idx)
 
static void get_texture_coordinate (const SMikkTSpaceContext *pContext, float r_uv[2], const int face_idx, const int vert_idx)
 
static void get_normal (const SMikkTSpaceContext *pContext, float r_no[3], const int face_idx, const int vert_idx)
 
static void set_tspace (const SMikkTSpaceContext *pContext, const float fv_tangent[3], const float face_sign, const int face_idx, const int vert_idx)
 
void BKE_mesh_calc_loop_tangent_single_ex (const MVert *mverts, const int UNUSED(numVerts), const MLoop *mloops, float(*r_looptangent)[4], const float(*loopnors)[3], const MLoopUV *loopuvs, const int UNUSED(numLoops), const MPoly *mpolys, const int numPolys, ReportList *reports)
 
void BKE_mesh_calc_loop_tangent_single (Mesh *mesh, const char *uvmap, float(*r_looptangents)[4], ReportList *reports)
 

Mesh Tangent Calculations (All Layers)

#define USE_LOOPTRI_DETECT_QUADS
 
static int dm_ts_GetNumFaces (const SMikkTSpaceContext *pContext)
 
static int dm_ts_GetNumVertsOfFace (const SMikkTSpaceContext *pContext, const int face_num)
 
static void dm_ts_GetPosition (const SMikkTSpaceContext *pContext, float r_co[3], const int face_num, const int vert_index)
 
static void dm_ts_GetTextureCoordinate (const SMikkTSpaceContext *pContext, float r_uv[2], const int face_num, const int vert_index)
 
static void dm_ts_GetNormal (const SMikkTSpaceContext *pContext, float r_no[3], const int face_num, const int vert_index)
 
static void dm_ts_SetTSpace (const SMikkTSpaceContext *pContext, const float fvTangent[3], const float fSign, const int face_num, const int vert_index)
 
static void DM_calc_loop_tangents_thread (TaskPool *__restrict UNUSED(pool), void *taskdata)
 
void BKE_mesh_add_loop_tangent_named_layer_for_uv (CustomData *uv_data, CustomData *tan_data, int numLoopData, const char *layer_name)
 
void BKE_mesh_calc_loop_tangent_step_0 (const CustomData *loopData, bool calc_active_tangent, const char(*tangent_names)[MAX_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)
 
void BKE_mesh_calc_loop_tangent_ex (const MVert *mvert, const MPoly *mpoly, const uint mpoly_len, const MLoop *mloop, const MLoopTri *looptri, const uint looptri_len, CustomData *loopdata, bool calc_active_tangent, const char(*tangent_names)[MAX_NAME], int tangent_names_len, const float(*vert_normals)[3], 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)
 
void BKE_mesh_calc_loop_tangents (Mesh *me_eval, bool calc_active_tangent, const char(*tangent_names)[MAX_NAME], int tangent_names_len)
 

Detailed Description

Functions to evaluate mesh tangents.

Definition in file mesh_tangent.c.

Macro Definition Documentation

◆ USE_LOOPTRI_DETECT_QUADS

#define USE_LOOPTRI_DETECT_QUADS

Definition at line 201 of file mesh_tangent.c.

Function Documentation

◆ BKE_mesh_add_loop_tangent_named_layer_for_uv()

void BKE_mesh_add_loop_tangent_named_layer_for_uv ( CustomData uv_data,
CustomData tan_data,
int  numLoopData,
const char *  layer_name 
)

◆ BKE_mesh_calc_loop_tangent_ex()

void BKE_mesh_calc_loop_tangent_ex ( const MVert mvert,
const MPoly mpoly,
const uint  mpoly_len,
const MLoop mloop,
const MLoopTri looptri,
const uint  looptri_len,
CustomData loopdata,
bool  calc_active_tangent,
const char(*)  tangent_names[MAX_NAME],
int  tangent_names_len,
const float(*)  vert_normals[3],
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 
)

◆ BKE_mesh_calc_loop_tangent_single()

void BKE_mesh_calc_loop_tangent_single ( struct Mesh mesh,
const char *  uvmap,
float(*)  r_looptangents[4],
struct ReportList reports 
)

Wrapper around BKE_mesh_calc_loop_tangent_single_ex, which takes care of most boilerplate code.

Note
  • There must be a valid loop's CD_NORMALS available.
  • The mesh should be made of only tris and quads!

Definition at line 153 of file mesh_tangent.c.

References BKE_mesh_calc_loop_tangent_single_ex(), BKE_report(), BKE_reportf(), CD_MLOOPUV, CD_NORMAL, CustomData_get_layer(), CustomData_get_layer_named(), float(), Mesh::ldata, mesh, Mesh::mloop, Mesh::mpoly, Mesh::mvert, RPT_ERROR, Mesh::totloop, Mesh::totpoly, and Mesh::totvert.

◆ BKE_mesh_calc_loop_tangent_single_ex()

void BKE_mesh_calc_loop_tangent_single_ex ( const MVert mverts,
const int   UNUSEDnumVerts,
const MLoop mloops,
float(*)  r_looptangent[4],
const float(*)  loopnors[3],
const MLoopUV loopuvs,
const int   UNUSEDnumLoops,
const MPoly mpolys,
const int  numPolys,
ReportList reports 
)

◆ BKE_mesh_calc_loop_tangent_step_0()

void BKE_mesh_calc_loop_tangent_step_0 ( const CustomData loopData,
bool  calc_active_tangent,
const char(*)  tangent_names[MAX_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 
)

◆ BKE_mesh_calc_loop_tangents()

void BKE_mesh_calc_loop_tangents ( Mesh me_eval,
bool  calc_active_tangent,
const char(*)  tangent_names[MAX_NAME],
int  tangent_names_len 
)

◆ DM_calc_loop_tangents_thread()

static void DM_calc_loop_tangents_thread ( TaskPool *__restrict   UNUSEDpool,
void taskdata 
)
static

◆ dm_ts_GetNormal()

static void dm_ts_GetNormal ( const SMikkTSpaceContext pContext,
float  r_no[3],
const int  face_num,
const int  vert_index 
)
static

◆ dm_ts_GetNumFaces()

static int dm_ts_GetNumFaces ( const SMikkTSpaceContext pContext)
static

◆ dm_ts_GetNumVertsOfFace()

static int dm_ts_GetNumVertsOfFace ( const SMikkTSpaceContext pContext,
const int  face_num 
)
static

◆ dm_ts_GetPosition()

static void dm_ts_GetPosition ( const SMikkTSpaceContext pContext,
float  r_co[3],
const int  face_num,
const int  vert_index 
)
static

◆ dm_ts_GetTextureCoordinate()

static void dm_ts_GetTextureCoordinate ( const SMikkTSpaceContext pContext,
float  r_uv[2],
const int  face_num,
const int  vert_index 
)
static

◆ dm_ts_SetTSpace()

static void dm_ts_SetTSpace ( const SMikkTSpaceContext pContext,
const float  fvTangent[3],
const float  fSign,
const int  face_num,
const int  vert_index 
)
static

◆ get_normal()

static void get_normal ( const SMikkTSpaceContext pContext,
float  r_no[3],
const int  face_idx,
const int  vert_idx 
)
static

◆ get_num_faces()

static int get_num_faces ( const SMikkTSpaceContext pContext)
static

◆ get_num_verts_of_face()

static int get_num_verts_of_face ( const SMikkTSpaceContext pContext,
const int  face_idx 
)
static

◆ get_position()

static void get_position ( const SMikkTSpaceContext pContext,
float  r_co[3],
const int  face_idx,
const int  vert_idx 
)
static

◆ get_texture_coordinate()

static void get_texture_coordinate ( const SMikkTSpaceContext pContext,
float  r_uv[2],
const int  face_idx,
const int  vert_idx 
)
static

◆ set_tspace()

static void set_tspace ( const SMikkTSpaceContext pContext,
const float  fv_tangent[3],
const float  face_sign,
const int  face_idx,
const int  vert_idx 
)
static