From 0ea5fc66924303d1bf73ba283a383e2aadee02f2 Mon Sep 17 00:00:00 2001 From: neodarz Date: Sat, 11 Aug 2018 20:21:34 +0200 Subject: Initial commit --- docs/doxygen/nel/a03456.html | 311 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 311 insertions(+) create mode 100644 docs/doxygen/nel/a03456.html (limited to 'docs/doxygen/nel/a03456.html') diff --git a/docs/doxygen/nel/a03456.html b/docs/doxygen/nel/a03456.html new file mode 100644 index 00000000..ffccf926 --- /dev/null +++ b/docs/doxygen/nel/a03456.html @@ -0,0 +1,311 @@ + + +NeL: NL3D::CStripifier class Reference + + + +
+

NL3D::CStripifier Class Reference

#include <stripifier.h> +

+


Detailed Description

+Wrapper to NVidia(tm) Stripifier
Author:
Lionel Berenguier

+Nevrax France

+
Date:
2001
+ +

+ +

+Definition at line 43 of file stripifier.h. + + + + + + + +

Public Member Functions

 CStripifier ()
 Constructor.

void optimizeTriangles (const CPrimitiveBlock &in, CPrimitiveBlock &out, uint cacheSize=10)
+


Constructor & Destructor Documentation

+

+ + + + +
+ + + + + + + + + +
NL3D::CStripifier::CStripifier  ) 
+
+ + + + + +
+   + + +

+Constructor. +

+ +

+Definition at line 42 of file stripifier.cpp. +

+

00043 {
+00044 }
+
+


Member Function Documentation

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
void NL3D::CStripifier::optimizeTriangles const CPrimitiveBlock in,
CPrimitiveBlock out,
uint  cacheSize = 10
+
+ + + + + +
+   + + +

+reorganize triangles to get efficiency of GPU vertex-cache. Default vertex cache is 10. out get the same list of triangles, but in different order. any list of lines / quads in out are not modified. NB: &in == &out is possible. +

+Definition at line 196 of file stripifier.cpp. +

+References NL3D::CCornerNode::FaceId, NL3D::CVertexCache::getVertexInCache(), in, NL3D::CCornerNode::Next, NL3D::CPrimitiveBlock::reserveTri(), NL3D::CPrimitiveBlock::setNumTri(), sint, NL3D::CVertexCache::tempTouchVertex(), uint, NL3D::COrderFace::v, v, and NL3D::CCornerNode::VertexId. +

+Referenced by NL3D::CMeshMRMSkinnedGeom::CLod::optimizeTriangleOrder(), NL3D::CMeshMRMGeom::CLod::optimizeTriangleOrder(), and NL3D::CMeshGeom::optimizeTriangleOrder(). +

+

00197 {
+00198         vector<COrderFace>      inFaces;
+00199         sint                    i;
+00200         sint                    numTris= in.getNumTri();
+00201 
+00202         // TestYoyo: All the same tri => perfect vertex caching...
+00203         /*out.setNumTri(numTris);
+00204         for(i=0;i< numTris; i++)
+00205         {
+00206                 uint32  v0= *(in.getTriPointer()+0);
+00207                 uint32  v1= *(in.getTriPointer()+1);
+00208                 uint32  v2= *(in.getTriPointer()+2);
+00209                 out.setTri(i, v0, v1, v2);
+00210         }
+00211         return;*/
+00212 
+00213 
+00214         // prepare inIndices.
+00215         //--------------------
+00216         inFaces.resize(numTris);
+00217         for(i=0;i< numTris; i++)
+00218         {
+00219                 inFaces[i].v[0]= in.getTriPointer()[i*3 + 0];
+00220                 inFaces[i].v[1]= in.getTriPointer()[i*3 + 1];
+00221                 inFaces[i].v[2]= in.getTriPointer()[i*3 + 2];
+00222                 inFaces[i].Inserted= false;
+00223         }
+00224 
+00225 
+00226         // build our cache, and compute max number of vertices.
+00227         //--------------------
+00228         int     numVerts=0;
+00229         for (i = 0; i < numTris; i++)
+00230         {
+00231                 numVerts= max(numVerts, (int)inFaces[i].v[0]);
+00232                 numVerts= max(numVerts, (int)inFaces[i].v[1]);
+00233                 numVerts= max(numVerts, (int)inFaces[i].v[2]);
+00234         }
+00235         numVerts++;
+00236         CVertexCache    vertexCache(cacheSize, numVerts);
+00237 
+00238 
+00239         // Compute vertex connectivity.
+00240         //--------------------
+00241         vector<CCornerNode*>    vertexConnectivity;
+00242         vector<CCornerNode>             cornerAllocator;
+00243         cornerAllocator.resize(numTris * 3);
+00244         vertexConnectivity.resize(numVerts, NULL);
+00245         // For all triangles.
+00246         for (i = 0; i < numTris; i++)
+00247         {
+00248                 COrderFace      *ordFace= &inFaces[i];
+00249                 // For each corner, allocate and fill
+00250                 for(sint j=0; j<3;j++)
+00251                 {
+00252                         sint    vertexId= ordFace->v[j];
+00253 
+00254                         // allocate a corner
+00255                         CCornerNode             *corner= &cornerAllocator[i*3 + j];
+00256 
+00257                         // fill it.
+00258                         corner->FaceId= i;
+00259                         corner->VertexId= vertexId;
+00260                         // Link it to the vertex list of faces.
+00261                         corner->Next= vertexConnectivity[vertexId];
+00262                         vertexConnectivity[vertexId]= corner;
+00263                 }
+00264         }
+00265 
+00266 
+00267         // build output optimized triangles
+00268         //--------------------
+00269         out.setNumTri(0);
+00270         out.reserveTri(numTris);
+00271 
+00272         for(i=0; i<numTris; i++)
+00273         {
+00274                 // force insertion of the ith face.
+00275                 sint    nextToInsert= i;
+00276                 bool    nextToInsertFound= true;
+00277                 while( nextToInsertFound )
+00278                 {
+00279                         nextToInsertFound= false;
+00280 
+00281                         // if the face is not yet inserted.
+00282                         if(!inFaces[nextToInsert].Inserted)
+00283                         {
+00284                                 // must insert this face.
+00285                                 inFaces[nextToInsert].insertInPB(out, vertexCache);
+00286 
+00287                                 sint    minC= 3;
+00288 
+00289                                 // look only for faces which use vertices in VertexCache, to get a face with at least one vertex.
+00290                                 for(uint j=0; j<cacheSize; j++)
+00291                                 {
+00292                                         // get a vertex from the vertex cache.
+00293                                         uint    vertexId= vertexCache.getVertexInCache(j);
+00294                                         // if empty entry
+00295                                         if(vertexId==0xFFFFFFFF)
+00296                                                 continue;
+00297 
+00298                                         // parse list of faces which use this vertex.
+00299                                         CCornerNode             *corner= vertexConnectivity[vertexId];
+00300                                         while(corner)
+00301                                         {
+00302                                                 uint    faceId= corner->FaceId;
+00303 
+00304                                                 // if the face is not yet inserted.
+00305                                                 if(!inFaces[faceId].Inserted)
+00306                                                 {
+00307                                                         sint    c= inFaces[faceId].countCacheMiss(vertexCache);
+00308                                                         // insert first any face which don't add any vertex in the cache.
+00309                                                         if(c==0)
+00310                                                         {
+00311                                                                 inFaces[faceId].insertInPB(out, vertexCache);
+00312                                                         }
+00313                                                         // else the one which add the minimum of vertex possible: nextToInsert
+00314                                                         else
+00315                                                         {
+00316                                                                 // Add cost of faces that use vertices pushed out (better results...)
+00317                                                                 uint    numVOut= c;
+00318                                                                 uint    k;
+00319                                                                 for(k=cacheSize-numVOut; k<cacheSize; k++)
+00320                                                                 {
+00321                                                                         uint    vertexOutId= vertexCache.getVertexInCache(k);
+00322                                                                         if(vertexOutId==0xFFFFFFFF)
+00323                                                                                 continue;
+00324                                                                         // TempRemove the vertex from the cache
+00325                                                                         vertexCache.tempTouchVertex(vertexOutId, false);
+00326                                                                 }
+00327                                                                 // parse all faces that still use those out vertices.
+00328                                                                 for(k=cacheSize-numVOut; k<cacheSize; k++)
+00329                                                                 {
+00330                                                                         uint    vertexOutId= vertexCache.getVertexInCache(k);
+00331                                                                         if(vertexOutId==0xFFFFFFFF)
+00332                                                                                 continue;
+00333                                                                         CCornerNode             *cornerOut= vertexConnectivity[vertexOutId];
+00334                                                                         while(cornerOut)
+00335                                                                         {
+00336                                                                                 uint    faceOutId= cornerOut->FaceId;
+00337 
+00338                                                                                 // if the face is not yet inserted AND not the one treated
+00339                                                                                 if(!inFaces[faceOutId].Inserted && faceOutId!=faceId)
+00340                                                                                 {
+00341                                                                                         // Add cache miss of this face
+00342                                                                                         c+= inFaces[faceOutId].countCacheMiss(vertexCache);
+00343                                                                                 }
+00344 
+00345                                                                                 // next corner
+00346                                                                                 cornerOut= cornerOut->Next;
+00347                                                                         }
+00348                                                                 }
+00349                                                                 // reset touch
+00350                                                                 for(k=cacheSize-numVOut; k<cacheSize; k++)
+00351                                                                 {
+00352                                                                         uint    vertexOutId= vertexCache.getVertexInCache(k);
+00353                                                                         if(vertexOutId==0xFFFFFFFF)
+00354                                                                                 continue;
+00355                                                                         // restore TempTouch the vertex from the cache
+00356                                                                         vertexCache.tempTouchVertex(vertexOutId, true);
+00357                                                                 }
+00358 
+00359 
+00360                                                                 // take the minimum cost
+00361                                                                 if(c<minC)
+00362                                                                 {
+00363                                                                         nextToInsert= faceId;
+00364                                                                         nextToInsertFound= true;
+00365                                                                         minC= c;
+00366                                                                 }
+00367                                                         }
+00368                                                 }
+00369 
+00370                                                 // next corner
+00371                                                 corner= corner->Next;
+00372                                         }
+00373 
+00374                                 }
+00375 
+00376                                 // if nextToInsertFound, then nextToInsert has the face which add the minimum of vertex possible in the cache
+00377                         }
+00378                 }
+00379 
+00380         }
+00381 
+00382 }
+
+


The documentation for this class was generated from the following files: +
Generated on Tue Mar 16 07:47:29 2004 for NeL by + +doxygen +1.3.6
+ + -- cgit v1.2.1