Blender  V3.3
Classes | Macros | Typedefs | Functions
mikktspace.c File Reference
#include <assert.h>
#include <float.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mikktspace.h"

Go to the source code of this file.

Classes

struct  SVec3
 
struct  SSubGroup
 
struct  SGroup
 
struct  STriInfo
 
struct  STSpace
 
union  SEdge
 
struct  VertReverseLookupContext
 

Macros

#define TFALSE   0
 
#define TTRUE   1
 
#define M_PI   3.1415926535897932384626433832795
 
#define INTERNAL_RND_SORT_SEED   39871946
 
#define MIKK_INLINE   static inline __attribute__((always_inline)) __attribute__((unused))
 
#define MARK_DEGENERATE   1
 
#define QUAD_ONE_DEGEN_TRI   2
 
#define GROUP_WITH_ANY   4
 
#define ORIENT_PRESERVING   8
 
#define HASH(x, y, z)   (((x)*73856093) ^ ((y)*19349663) ^ ((z)*83492791))
 
#define HASH_F(x, y, z)   HASH(float_as_uint(x), float_as_uint(y), float_as_uint(z))
 

Typedefs

typedef unsigned int uint
 
typedef struct VertReverseLookupContext VertReverseLookupContext
 

Functions

MIKK_INLINE tbool veq (const SVec3 v1, const SVec3 v2)
 
MIKK_INLINE SVec3 vadd (const SVec3 v1, const SVec3 v2)
 
MIKK_INLINE SVec3 vsub (const SVec3 v1, const SVec3 v2)
 
MIKK_INLINE SVec3 vscale (const float fS, const SVec3 v)
 
MIKK_INLINE float LengthSquared (const SVec3 v)
 
MIKK_INLINE float Length (const SVec3 v)
 
MIKK_INLINE SVec3 NormalizeSafe (const SVec3 v)
 
MIKK_INLINE float vdot (const SVec3 v1, const SVec3 v2)
 
MIKK_INLINE tbool NotZero (const float fX)
 
MIKK_INLINE unsigned int rotl (unsigned int value, unsigned int count)
 
static int GenerateInitialVerticesIndexList (STriInfo pTriInfos[], int piTriList_out[], const SMikkTSpaceContext *pContext, const int iNrTrianglesIn)
 
static void GenerateSharedVerticesIndexList (int piTriList_in_and_out[], const SMikkTSpaceContext *pContext, const int iNrTrianglesIn)
 
static void InitTriInfo (STriInfo pTriInfos[], const int piTriListIn[], const SMikkTSpaceContext *pContext, const int iNrTrianglesIn)
 
static int Build4RuleGroups (STriInfo pTriInfos[], SGroup pGroups[], int piGroupTrianglesBuffer[], const int piTriListIn[], const int iNrTrianglesIn)
 
static tbool GenerateTSpaces (STSpace psTspace[], const STriInfo pTriInfos[], const SGroup pGroups[], const int iNrActiveGroups, const int piTriListIn[], const float fThresCos, const SMikkTSpaceContext *pContext)
 
MIKK_INLINE int MakeIndex (const int iFace, const int iVert)
 
MIKK_INLINE void IndexToData (int *piFace, int *piVert, const int iIndexIn)
 
static STSpace AvgTSpace (const STSpace *pTS0, const STSpace *pTS1)
 
MIKK_INLINE SVec3 GetPosition (const SMikkTSpaceContext *pContext, const int index)
 
MIKK_INLINE SVec3 GetNormal (const SMikkTSpaceContext *pContext, const int index)
 
MIKK_INLINE SVec3 GetTexCoord (const SMikkTSpaceContext *pContext, const int index)
 
static void DegenPrologue (STriInfo pTriInfos[], int piTriList_out[], const int iNrTrianglesIn, const int iTotTris)
 
static void DegenEpilogue (STSpace psTspace[], STriInfo pTriInfos[], int piTriListIn[], const SMikkTSpaceContext *pContext, const int iNrTrianglesIn, const int iTotTris)
 
tbool genTangSpaceDefault (const SMikkTSpaceContext *pContext)
 
tbool genTangSpace (const SMikkTSpaceContext *pContext, const float fAngularThreshold)
 
static void GenerateSharedVerticesIndexListSlow (int piTriList_in_and_out[], const SMikkTSpaceContext *pContext, const int iNrTrianglesIn)
 
static uint float_as_uint (const float v)
 
static void radixsort_pair (uint *comp, int *data, uint *comp2, int *data2, int n)
 
static void BuildNeighborsFast (STriInfo pTriInfos[], SEdge *pEdges, const int piTriListIn[], const int iNrTrianglesIn)
 
static void BuildNeighborsSlow (STriInfo pTriInfos[], const int piTriListIn[], const int iNrTrianglesIn)
 
static float CalcTexArea (const SMikkTSpaceContext *pContext, const int indices[])
 
static tbool AssignRecur (const int piTriListIn[], STriInfo psTriInfos[], const int iMyTriIndex, SGroup *pGroup)
 
MIKK_INLINE void AddTriToGroup (SGroup *pGroup, const int iTriIndex)
 
static tbool CompareSubGroups (const SSubGroup *pg1, const SSubGroup *pg2)
 
static void QuickSort (int *pSortBuffer, int iLeft, int iRight, unsigned int uSeed)
 
static STSpace EvalTspace (const int face_indices[], const int iFaces, const int piTriListIn[], const STriInfo pTriInfos[], const SMikkTSpaceContext *pContext, const int iVertexRepresentitive)
 
static void QuickSortEdges (SEdge *pSortBuffer, int iLeft, int iRight, const int channel, unsigned int uSeed)
 
static void GetEdge (int *i0_out, int *i1_out, int *edgenum_out, const int indices[], const int i0_in, const int i1_in)
 
static void GenerateReverseLookup (const int piTriListIn[], const int iNrTrianglesIn, VertReverseLookupContext *pLookupCtx)
 
static int LookupVertexIndexFromGoodTriangle (VertReverseLookupContext *pLookupCtx, int piTriListIn[], const int iNrTrianglesIn, const int iVertexIndex)
 
static void FreeReverseLookup (VertReverseLookupContext *pLookupCtx)
 

Macro Definition Documentation

◆ GROUP_WITH_ANY

#define GROUP_WITH_ANY   4

Definition at line 149 of file mikktspace.c.

◆ HASH

#define HASH (   x,
  y,
  z 
)    (((x)*73856093) ^ ((y)*19349663) ^ ((z)*83492791))

Definition at line 472 of file mikktspace.c.

◆ HASH_F

#define HASH_F (   x,
  y,
  z 
)    HASH(float_as_uint(x), float_as_uint(y), float_as_uint(z))

Definition at line 473 of file mikktspace.c.

◆ INTERNAL_RND_SORT_SEED

#define INTERNAL_RND_SORT_SEED   39871946

Definition at line 25 of file mikktspace.c.

◆ M_PI

#define M_PI   3.1415926535897932384626433832795

Definition at line 22 of file mikktspace.c.

◆ MARK_DEGENERATE

#define MARK_DEGENERATE   1

Definition at line 147 of file mikktspace.c.

◆ MIKK_INLINE

#define MIKK_INLINE   static inline __attribute__((always_inline)) __attribute__((unused))

Definition at line 30 of file mikktspace.c.

◆ ORIENT_PRESERVING

#define ORIENT_PRESERVING   8

Definition at line 150 of file mikktspace.c.

◆ QUAD_ONE_DEGEN_TRI

#define QUAD_ONE_DEGEN_TRI   2

Definition at line 148 of file mikktspace.c.

◆ TFALSE

#define TFALSE   0

Definition at line 18 of file mikktspace.c.

◆ TTRUE

#define TTRUE   1

Definition at line 19 of file mikktspace.c.

Typedef Documentation

◆ uint

typedef unsigned int uint

Definition at line 465 of file mikktspace.c.

◆ VertReverseLookupContext

Function Documentation

◆ AddTriToGroup()

MIKK_INLINE void AddTriToGroup ( SGroup pGroup,
const int  iTriIndex 
)

Definition at line 1037 of file mikktspace.c.

References SGroup::iNrFaces, and SGroup::pFaceIndices.

Referenced by AssignRecur(), and Build4RuleGroups().

◆ AssignRecur()

static tbool AssignRecur ( const int  piTriListIn[],
STriInfo  psTriInfos[],
const int  iMyTriIndex,
SGroup pGroup 
)
static

◆ AvgTSpace()

static STSpace AvgTSpace ( const STSpace pTS0,
const STSpace pTS1 
)
static

Definition at line 211 of file mikktspace.c.

References STSpace::fMagS, STSpace::fMagT, NormalizeSafe(), vadd(), veq(), STSpace::vOs, and STSpace::vOt.

Referenced by GenerateTSpaces().

◆ Build4RuleGroups()

static int Build4RuleGroups ( STriInfo  pTriInfos[],
SGroup  pGroups[],
int  piGroupTrianglesBuffer[],
const int  piTriListIn[],
const int  iNrTrianglesIn 
)
static

◆ BuildNeighborsFast()

static void BuildNeighborsFast ( STriInfo  pTriInfos[],
SEdge pEdges,
const int  piTriListIn[],
const int  iNrTrianglesIn 
)
static

◆ BuildNeighborsSlow()

static void BuildNeighborsSlow ( STriInfo  pTriInfos[],
const int  piTriListIn[],
const int  iNrTrianglesIn 
)
static

Definition at line 1525 of file mikktspace.c.

References STriInfo::FaceNeighbors, t, TFALSE, and TTRUE.

Referenced by InitTriInfo().

◆ CalcTexArea()

static float CalcTexArea ( const SMikkTSpaceContext pContext,
const int  indices[] 
)
static

Definition at line 822 of file mikktspace.c.

References GetTexCoord(), indices, SVec3::x, and SVec3::y.

Referenced by InitTriInfo().

◆ CompareSubGroups()

static tbool CompareSubGroups ( const SSubGroup pg1,
const SSubGroup pg2 
)
static

Definition at line 1361 of file mikktspace.c.

References SSubGroup::iNrFaces, SSubGroup::pTriMembers, TFALSE, and TTRUE.

Referenced by GenerateTSpaces().

◆ DegenEpilogue()

static void DegenEpilogue ( STSpace  psTspace[],
STriInfo  pTriInfos[],
int  piTriListIn[],
const SMikkTSpaceContext pContext,
const int  iNrTrianglesIn,
const int  iTotTris 
)
static

◆ DegenPrologue()

static void DegenPrologue ( STriInfo  pTriInfos[],
int  piTriList_out[],
const int  iNrTrianglesIn,
const int  iTotTris 
)
static

Definition at line 1674 of file mikktspace.c.

References STriInfo::iFlag, STriInfo::iOrgFaceNumber, MARK_DEGENERATE, QUAD_ONE_DEGEN_TRI, t, TFALSE, and TTRUE.

Referenced by genTangSpace().

◆ EvalTspace()

static STSpace EvalTspace ( const int  face_indices[],
const int  iFaces,
const int  piTriListIn[],
const STriInfo  pTriInfos[],
const SMikkTSpaceContext pContext,
const int  iVertexRepresentitive 
)
static

◆ float_as_uint()

static uint float_as_uint ( const float  v)
static

Definition at line 467 of file mikktspace.c.

References v.

◆ FreeReverseLookup()

static void FreeReverseLookup ( VertReverseLookupContext pLookupCtx)
static

◆ GenerateInitialVerticesIndexList()

static int GenerateInitialVerticesIndexList ( STriInfo  pTriInfos[],
int  piTriList_out[],
const SMikkTSpaceContext pContext,
const int  iNrTrianglesIn 
)
static

◆ GenerateReverseLookup()

static void GenerateReverseLookup ( const int  piTriListIn[],
const int  iNrTrianglesIn,
VertReverseLookupContext pLookupCtx 
)
static

◆ GenerateSharedVerticesIndexList()

static void GenerateSharedVerticesIndexList ( int  piTriList_in_and_out[],
const SMikkTSpaceContext pContext,
const int  iNrTrianglesIn 
)
static

◆ GenerateSharedVerticesIndexListSlow()

static void GenerateSharedVerticesIndexListSlow ( int  piTriList_in_and_out[],
const SMikkTSpaceContext pContext,
const int  iNrTrianglesIn 
)
static

Definition at line 600 of file mikktspace.c.

References GetNormal(), GetPosition(), GetTexCoord(), t, TFALSE, TTRUE, and veq().

Referenced by GenerateSharedVerticesIndexList().

◆ GenerateTSpaces()

static tbool GenerateTSpaces ( STSpace  psTspace[],
const STriInfo  pTriInfos[],
const SGroup  pGroups[],
const int  iNrActiveGroups,
const int  piTriListIn[],
const float  fThresCos,
const SMikkTSpaceContext pContext 
)
static

◆ genTangSpace()

tbool genTangSpace ( const SMikkTSpaceContext pContext,
const float  fAngularThreshold 
)

◆ genTangSpaceDefault()

tbool genTangSpaceDefault ( const SMikkTSpaceContext pContext)

◆ GetEdge()

static void GetEdge ( int *  i0_out,
int *  i1_out,
int *  edgenum_out,
const int  indices[],
const int  i0_in,
const int  i1_in 
)
static

Definition at line 1640 of file mikktspace.c.

References indices.

Referenced by BuildNeighborsFast().

◆ GetNormal()

MIKK_INLINE SVec3 GetNormal ( const SMikkTSpaceContext pContext,
const int  index 
)

◆ GetPosition()

MIKK_INLINE SVec3 GetPosition ( const SMikkTSpaceContext pContext,
const int  index 
)

◆ GetTexCoord()

MIKK_INLINE SVec3 GetTexCoord ( const SMikkTSpaceContext pContext,
const int  index 
)

◆ IndexToData()

MIKK_INLINE void IndexToData ( int *  piFace,
int *  piVert,
const int  iIndexIn 
)

Definition at line 205 of file mikktspace.c.

Referenced by GetNormal(), GetPosition(), and GetTexCoord().

◆ InitTriInfo()

static void InitTriInfo ( STriInfo  pTriInfos[],
const int  piTriListIn[],
const SMikkTSpaceContext pContext,
const int  iNrTrianglesIn 
)
static

◆ Length()

MIKK_INLINE float Length ( const SVec3  v)

Definition at line 81 of file mikktspace.c.

References LengthSquared(), sqrtf, and v.

Referenced by gpencil_modifier_type_init(), InitTriInfo(), and NormalizeSafe().

◆ LengthSquared()

MIKK_INLINE float LengthSquared ( const SVec3  v)

Definition at line 76 of file mikktspace.c.

References v.

Referenced by GenerateInitialVerticesIndexList(), and Length().

◆ LookupVertexIndexFromGoodTriangle()

static int LookupVertexIndexFromGoodTriangle ( VertReverseLookupContext pLookupCtx,
int  piTriListIn[],
const int  iNrTrianglesIn,
const int  iVertexIndex 
)
static

◆ MakeIndex()

MIKK_INLINE int MakeIndex ( const int  iFace,
const int  iVert 
)

Definition at line 199 of file mikktspace.c.

Referenced by DegenEpilogue(), and GenerateInitialVerticesIndexList().

◆ NormalizeSafe()

MIKK_INLINE SVec3 NormalizeSafe ( const SVec3  v)

Definition at line 93 of file mikktspace.c.

References len, Length(), v, and vscale().

Referenced by AvgTSpace(), EvalTspace(), and GenerateTSpaces().

◆ NotZero()

MIKK_INLINE tbool NotZero ( const float  fX)

Definition at line 109 of file mikktspace.c.

References fabsf.

Referenced by InitTriInfo().

◆ QuickSort()

static void QuickSort ( int *  pSortBuffer,
int  iLeft,
int  iRight,
unsigned int  uSeed 
)
static

Definition at line 1375 of file mikktspace.c.

References rotl(), and t.

Referenced by GenerateTSpaces().

◆ QuickSortEdges()

static void QuickSortEdges ( SEdge pSortBuffer,
int  iLeft,
int  iRight,
const int  channel,
unsigned int  uSeed 
)
static

Definition at line 1570 of file mikktspace.c.

References SEdge::array, rotl(), and t.

Referenced by BuildNeighborsFast().

◆ radixsort_pair()

static void radixsort_pair ( uint comp,
int *  data,
uint comp2,
int *  data2,
int  n 
)
static

Definition at line 477 of file mikktspace.c.

References data, data2, and pos.

Referenced by GenerateSharedVerticesIndexList().

◆ rotl()

MIKK_INLINE unsigned int rotl ( unsigned int  value,
unsigned int  count 
)

Definition at line 127 of file mikktspace.c.

References count, and mask().

Referenced by QuickSort(), and QuickSortEdges().

◆ vadd()

MIKK_INLINE SVec3 vadd ( const SVec3  v1,
const SVec3  v2 
)

Definition at line 43 of file mikktspace.c.

References v1, v2, SVec3::x, SVec3::y, and SVec3::z.

Referenced by AvgTSpace(), EvalTspace(), and InitTriInfo().

◆ vdot()

MIKK_INLINE float vdot ( const SVec3  v1,
const SVec3  v2 
)

Definition at line 104 of file mikktspace.c.

References v1, and v2.

Referenced by EvalTspace(), and GenerateTSpaces().

◆ veq()

MIKK_INLINE tbool veq ( const SVec3  v1,
const SVec3  v2 
)

◆ vscale()

MIKK_INLINE SVec3 vscale ( const float  fS,
const SVec3  v 
)

Definition at line 65 of file mikktspace.c.

References v, SVec3::x, SVec3::y, and SVec3::z.

Referenced by EvalTspace(), GenerateTSpaces(), InitTriInfo(), and NormalizeSafe().

◆ vsub()

MIKK_INLINE SVec3 vsub ( const SVec3  v1,
const SVec3  v2 
)

Definition at line 54 of file mikktspace.c.

References v1, v2, SVec3::x, SVec3::y, and SVec3::z.

Referenced by EvalTspace(), GenerateInitialVerticesIndexList(), GenerateTSpaces(), and InitTriInfo().