Blender  V2.93
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 (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 165 of file mikktspace.c.

◆ HASH

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

Definition at line 486 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 487 of file mikktspace.c.

◆ INTERNAL_RND_SORT_SEED

#define INTERNAL_RND_SORT_SEED   39871946

Definition at line 41 of file mikktspace.c.

◆ M_PI

#define M_PI   3.1415926535897932384626433832795

Definition at line 38 of file mikktspace.c.

◆ MARK_DEGENERATE

#define MARK_DEGENERATE   1

Definition at line 163 of file mikktspace.c.

◆ MIKK_INLINE

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

Definition at line 46 of file mikktspace.c.

◆ ORIENT_PRESERVING

#define ORIENT_PRESERVING   8

Definition at line 166 of file mikktspace.c.

◆ QUAD_ONE_DEGEN_TRI

#define QUAD_ONE_DEGEN_TRI   2

Definition at line 164 of file mikktspace.c.

◆ TFALSE

#define TFALSE   0

Copyright (C) 2011 by Morten S. Mikkelsen

This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.

Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:

  1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
  2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
  3. This notice may not be removed or altered from any source distribution.

Definition at line 34 of file mikktspace.c.

◆ TTRUE

#define TTRUE   1

Definition at line 35 of file mikktspace.c.

Typedef Documentation

◆ uint

typedef unsigned int uint

Definition at line 479 of file mikktspace.c.

◆ VertReverseLookupContext

Function Documentation

◆ AddTriToGroup()

MIKK_INLINE void AddTriToGroup ( SGroup pGroup,
const int  iTriIndex 
)

Definition at line 1047 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 227 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 1539 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 832 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 1375 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 1688 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 ( 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 481 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 611 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 1654 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 221 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 97 of file mikktspace.c.

References LengthSquared(), sqrtf, and v.

Referenced by InitTriInfo(), and NormalizeSafe().

◆ LengthSquared()

MIKK_INLINE float LengthSquared ( const SVec3  v)

Definition at line 92 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 215 of file mikktspace.c.

Referenced by DegenEpilogue(), and GenerateInitialVerticesIndexList().

◆ NormalizeSafe()

MIKK_INLINE SVec3 NormalizeSafe ( const SVec3  v)

Definition at line 109 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 125 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 1389 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 1584 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 491 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 143 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 59 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 120 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 81 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 70 of file mikktspace.c.

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

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