6 #include "precompiled.h"
33 #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
39 static void MergeVertsFast(
int * piCurNrUniqueVertices,
int * piRemapTable,
float * pfVertexDataOut,
int * piVertexIDs,
40 const float pfVertexDataIn[],
const int iNrVerticesIn,
const int iFloatsPerVert,
41 const int iL_in,
const int iR_in,
const int iChannelNum);
43 int WeldMesh(
int * piRemapTable,
float * pfVertexDataOut,
44 const float pfVertexDataIn[],
const int iNrVerticesIn,
const int iFloatsPerVert)
46 int iUniqueVertices = 0, i=0;
47 int * piVertexIDs = NULL;
48 if(iNrVerticesIn<=0)
return 0;
52 piVertexIDs = (
int *) malloc(
sizeof(
int)*iNrVerticesIn);
55 for(i=0; i<iNrVerticesIn; i++)
61 MergeVertsFast(&iUniqueVertices, piRemapTable, pfVertexDataOut, piVertexIDs,
62 pfVertexDataIn, iNrVerticesIn, iFloatsPerVert, 0, iNrVerticesIn-1, 0);
67 for(i=0; i<iUniqueVertices; i++)
68 assert(piRemapTable[i]>=0);
71 return iUniqueVertices;
78 static void MergeVertsFast(
int * piCurNrUniqueVertices,
int * piRemapTable,
float * pfVertexDataOut,
int * piVertexIDs,
79 const float pfVertexDataIn[],
const int iNrVerticesIn,
const int iFloatsPerVert,
80 const int iL_in,
const int iR_in,
const int iChannelNum)
82 const int iCount = iR_in-iL_in+1;
84 float fMin, fMax, fAvg;
87 fMin = pfVertexDataIn[ piVertexIDs[iL_in]*iFloatsPerVert + iChannelNum]; fMax = fMin;
88 for(l=(iL_in+1); l<=iR_in; l++)
90 const int index = piVertexIDs[l]*iFloatsPerVert + iChannelNum;
91 const float fVal = pfVertexDataIn[index];
92 if(fMin>fVal) fMin=fVal;
93 else if(fMax<fVal) fMax=fVal;
98 fAvg = 0.5f*(fMax + fMin);
99 if(fAvg<=fMin || fAvg>=fMax || iCount==1)
101 if((iChannelNum+1) == iFloatsPerVert || iCount==1)
103 int iUniqueNewVertices = 0;
104 float * pfNewUniVertsOut = &pfVertexDataOut[ piCurNrUniqueVertices[0]*iFloatsPerVert ];
106 for(l=iL_in; l<=iR_in; l++)
108 const int index = piVertexIDs[l]*iFloatsPerVert;
112 while(l2<iUniqueNewVertices && iFound==0)
114 const int index2 = l2*iFloatsPerVert;
118 while(iAllSame!=0 && c<iFloatsPerVert)
120 iAllSame &= (pfVertexDataIn[index+c] == pfNewUniVertsOut[index2+c] ? 1 : 0);
131 memcpy(pfNewUniVertsOut+iUniqueNewVertices*iFloatsPerVert, pfVertexDataIn+index,
sizeof(
float)*iFloatsPerVert);
132 ++iUniqueNewVertices;
135 assert(piRemapTable[piVertexIDs[l]] == -1);
136 piRemapTable[piVertexIDs[l]] = piCurNrUniqueVertices[0] + l2;
139 piCurNrUniqueVertices[0] += iUniqueNewVertices;
143 MergeVertsFast(piCurNrUniqueVertices, piRemapTable, pfVertexDataOut, piVertexIDs,
144 pfVertexDataIn, iNrVerticesIn, iFloatsPerVert,
145 iL_in, iR_in, iChannelNum+1);
150 int iL=iL_in, iR=iR_in, index;
155 int iReadyLeftSwap = 0;
156 int iReadyRightSwap = 0;
157 while(iReadyLeftSwap==0 && iL<iR)
159 assert(iL>=iL_in && iL<=iR_in);
160 index = piVertexIDs[iL]*iFloatsPerVert+iChannelNum;
161 iReadyLeftSwap = !(pfVertexDataIn[index]<fAvg) ? 1 : 0;
162 if(iReadyLeftSwap==0) ++iL;
164 while(iReadyRightSwap==0 && iL<iR)
166 assert(iR>=iL_in && iR<=iR_in);
167 index = piVertexIDs[iR]*iFloatsPerVert+iChannelNum;
168 iReadyRightSwap = pfVertexDataIn[index]<fAvg ? 1 : 0;
169 if(iReadyRightSwap==0) --iR;
171 assert( (iL<iR) || (iReadyLeftSwap==0 || iReadyRightSwap==0));
173 if(iReadyLeftSwap!=0 && iReadyRightSwap!=0)
177 iID = piVertexIDs[iL];
178 piVertexIDs[iL] = piVertexIDs[iR];
179 piVertexIDs[iR] = iID;
184 assert(iL==(iR+1) || (iL==iR));
187 const int index = piVertexIDs[iR]*iFloatsPerVert+iChannelNum;
188 const int iReadyRightSwap = pfVertexDataIn[index]<fAvg ? 1 : 0;
189 if(iReadyRightSwap!=0) ++iL;
195 MergeVertsFast(piCurNrUniqueVertices, piRemapTable, pfVertexDataOut, piVertexIDs,
196 pfVertexDataIn, iNrVerticesIn, iFloatsPerVert, iL_in, iR, iChannelNum);
198 MergeVertsFast(piCurNrUniqueVertices, piRemapTable, pfVertexDataOut, piVertexIDs,
199 pfVertexDataIn, iNrVerticesIn, iFloatsPerVert, iL, iR_in, iChannelNum);
int WeldMesh(int *piRemapTable, float *pfVertexDataOut, const float pfVertexDataIn[], const int iNrVerticesIn, const int iFloatsPerVert)
Copyright (C) 2011 by Morten S.
static void MergeVertsFast(int *piCurNrUniqueVertices, int *piRemapTable, float *pfVertexDataOut, int *piVertexIDs, const float pfVertexDataIn[], const int iNrVerticesIn, const int iFloatsPerVert, const int iL_in, const int iR_in, const int iChannelNum)
Copyright (C) 2011 by Morten S.