#include <assert.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <float.h>
#include <stdlib.h>
#include "mikktspace.h"
#define TFALSE …
#define TTRUE …
#ifndef M_PI
#define M_PI …
#endif
#define INTERNAL_RND_SORT_SEED …
SVec3;
static tbool veq( const SVec3 v1, const SVec3 v2 )
{ … }
static SVec3 vadd( const SVec3 v1, const SVec3 v2 )
{ … }
static SVec3 vsub( const SVec3 v1, const SVec3 v2 )
{ … }
static SVec3 vscale(const float fS, const SVec3 v)
{ … }
static float LengthSquared( const SVec3 v )
{ … }
static float Length( const SVec3 v )
{ … }
static SVec3 Normalize( const SVec3 v )
{ … }
static float vdot( const SVec3 v1, const SVec3 v2)
{ … }
static tbool NotZero(const float fX)
{ … }
static tbool VNotZero(const SVec3 v)
{ … }
SSubGroup;
SGroup;
#define MARK_DEGENERATE …
#define QUAD_ONE_DEGEN_TRI …
#define GROUP_WITH_ANY …
#define ORIENT_PRESERVING …
STriInfo;
STSpace;
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);
static int MakeIndex(const int iFace, const int iVert)
{ … }
static void IndexToData(int * piFace, int * piVert, const int iIndexIn)
{ … }
static STSpace AvgTSpace(const STSpace * pTS0, const STSpace * pTS1)
{ … }
static SVec3 GetPosition(const SMikkTSpaceContext * pContext, const int index);
static SVec3 GetNormal(const SMikkTSpaceContext * pContext, const int index);
static 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)
{ … }
STmpVert;
static const int g_iCells = …;
#ifdef _MSC_VER
#define NOINLINE …
#else
#define NOINLINE …
#endif
static NOINLINE int FindGridCell(const float fMin, const float fMax, const float fVal)
{ … }
static void MergeVertsFast(int piTriList_in_and_out[], STmpVert pTmpVert[], const SMikkTSpaceContext * pContext, const int iL_in, const int iR_in);
static void MergeVertsSlow(int piTriList_in_and_out[], const SMikkTSpaceContext * pContext, const int pTable[], const int iEntries);
static void GenerateSharedVerticesIndexListSlow(int piTriList_in_and_out[], const SMikkTSpaceContext * pContext, const int iNrTrianglesIn);
static void GenerateSharedVerticesIndexList(int piTriList_in_and_out[], const SMikkTSpaceContext * pContext, const int iNrTrianglesIn)
{ … }
static void MergeVertsFast(int piTriList_in_and_out[], STmpVert pTmpVert[], const SMikkTSpaceContext * pContext, const int iL_in, const int iR_in)
{ … }
static void MergeVertsSlow(int piTriList_in_and_out[], const SMikkTSpaceContext * pContext, const int pTable[], const int iEntries)
{ … }
static void GenerateSharedVerticesIndexListSlow(int piTriList_in_and_out[], const SMikkTSpaceContext * pContext, const int iNrTrianglesIn)
{ … }
static int GenerateInitialVerticesIndexList(STriInfo pTriInfos[], int piTriList_out[], const SMikkTSpaceContext * pContext, const int iNrTrianglesIn)
{ … }
static SVec3 GetPosition(const SMikkTSpaceContext * pContext, const int index)
{ … }
static SVec3 GetNormal(const SMikkTSpaceContext * pContext, const int index)
{ … }
static SVec3 GetTexCoord(const SMikkTSpaceContext * pContext, const int index)
{ … }
SEdge;
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 void InitTriInfo(STriInfo pTriInfos[], const int piTriListIn[], const SMikkTSpaceContext * pContext, const int iNrTrianglesIn)
{ … }
static tbool AssignRecur(const int piTriListIn[], STriInfo psTriInfos[], const int iMyTriIndex, SGroup * pGroup);
static void AddTriToGroup(SGroup * pGroup, const int iTriIndex);
static int Build4RuleGroups(STriInfo pTriInfos[], SGroup pGroups[], int piGroupTrianglesBuffer[], const int piTriListIn[], const int iNrTrianglesIn)
{ … }
static void AddTriToGroup(SGroup * pGroup, const int iTriIndex)
{ … }
static tbool AssignRecur(const int piTriListIn[], STriInfo psTriInfos[],
const int iMyTriIndex, SGroup * pGroup)
{ … }
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 tbool GenerateTSpaces(STSpace psTspace[], const STriInfo pTriInfos[], const SGroup pGroups[],
const int iNrActiveGroups, const int piTriListIn[], const float fThresCos,
const SMikkTSpaceContext * pContext)
{ … }
static STSpace EvalTspace(int face_indices[], const int iFaces, const int piTriListIn[], const STriInfo pTriInfos[],
const SMikkTSpaceContext * pContext, const int iVertexRepresentitive)
{ … }
static tbool CompareSubGroups(const SSubGroup * pg1, const SSubGroup * pg2)
{ … }
static void QuickSort(int* pSortBuffer, int iLeft, int iRight, unsigned int uSeed)
{ … }
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 BuildNeighborsFast(STriInfo pTriInfos[], SEdge * pEdges, const int piTriListIn[], const int iNrTrianglesIn)
{ … }
static void BuildNeighborsSlow(STriInfo pTriInfos[], const int piTriListIn[], const int iNrTrianglesIn)
{ … }
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 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)
{ … }