⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nvmeshmender.cpp

📁 linux 下的机器人足球仿真平台
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				texCoords.y = nv_min( texCoords.y, 1.0f );				pTex0[ p ].x = texCoords.x-0.25f;				if ( pTex0[ p ].x < nv_zero ) pTex0[ p ].x += 1.0;				pTex0[ p ].y = 1.0f-texCoords.y;				pTex0[ p ].z = 1.0f;			}		}		if ( _FixCylindricalTexGen == FixCylindricalTexGen )		{    		Mapping::iterator texIter = outmap.find( "tex0" );			VertexAttribute::FloatVector& texcoords = ( output[ (*texIter).second ].floatVector_ );			const unsigned int theSize = indices.size();						for ( unsigned int f = 0; f < theSize; f += 3 )			{				for ( int v = 0; v < 3; ++v )				{					int start = f + v;					int end = start + 1;					if ( v == 2 )					{						end = f;					}					float dS = texcoords[ indices[ end ] * 3 + 0 ] - texcoords[ indices[ start ] * 3 + 0 ];					float newS = nv_zero;					bool bDoS = false;					unsigned int theOneToChange = start;					if ( fabs( dS ) >= 0.5f )					{						bDoS = true;						if ( texcoords[ indices[ start ] * 3 + 0 ] < texcoords[ indices[ end ] * 3 + 0 ] )						{							newS = texcoords[ indices[ start ]* 3 + 0 ] + 1.0f;						}						else						{							theOneToChange = end;							newS = texcoords[ indices[ end ] * 3 + 0 ] + 1.0f;						}					}					if ( bDoS == true )					{						unsigned int theNewIndex = texcoords.size() / 3;						// Duplicate every part of the vertex						for ( unsigned int att = 0; att < output.size(); ++att )						{							// No new indices are created, just vertex attributes							if ( output[ att ].Name_ != "indices" )							{								if ( output[ att ].Name_ == "tex0" ) 								{									output[ att ].floatVector_.push_back( newS ); // y									output[ att ].floatVector_.push_back( output[ att ].floatVector_[ indices[ theOneToChange ] * 3 + 1 ] ); // x									output[ att ].floatVector_.push_back( output[ att ].floatVector_[ indices[ theOneToChange ] * 3 + 2 ] ); // z								}								else								{									// *3 b/c we are looking up 3vectors in an array of floats									output[ att ].floatVector_.push_back( output[ att ].floatVector_[ indices[ theOneToChange ] * 3 + 0 ] ); // x									output[ att ].floatVector_.push_back( output[ att ].floatVector_[ indices[ theOneToChange ] * 3 + 1 ] ); // y									output[ att ].floatVector_.push_back( output[ att ].floatVector_[ indices[ theOneToChange ] * 3 + 2 ] ); // z								}							}						}                        IdenticalVertices_.push_back( EmptySet );                        IdenticalVertices_[ indices[ theOneToChange ] ].insert( theNewIndex );                        IdenticalVertices_[ theNewIndex ].insert( indices[ theOneToChange ] );						// point to where the new vertices will go						indices[ theOneToChange ] = theNewIndex;					}				} // for v				{				for ( int v = 0; v < 3; ++v )				{					int start = f + v;					int end = start + 1;					if ( v == 2 )					{						end = f;					}					float dT = texcoords[ indices[ end ] * 3 + 1 ] - texcoords[ indices[ start ] * 3 + 1 ];					float newT = nv_zero;					bool bDoT = false;					unsigned int theOneToChange = start;					if ( fabs( dT ) >= 0.5f )					{						bDoT = true;						if ( texcoords[ indices[ start ] * 3 + 1 ] < texcoords[ indices[ end ] * 3 + 1 ] )						{							newT = texcoords[ indices[ start ] * 3 + 1 ] + 1.0f;						}						else						{							theOneToChange = end;							newT = texcoords[ indices[ end ] * 3 + 1 ] + 1.0f;						}					}					if ( bDoT == true )					{						unsigned int theNewIndex = texcoords.size() / 3;						// Duplicate every part of the vertex						for ( unsigned int att = 0; att < output.size(); ++att )						{							// No new indices are created, just vertex attributes							if ( output[ att ].Name_ != "indices" )							{								if ( output[ att ].Name_ == "tex0" ) 								{									output[ att ].floatVector_.push_back( output[ att ].floatVector_[ indices[ theOneToChange ] * 3 + 0 ] ); // x									output[ att ].floatVector_.push_back( newT ); // y									output[ att ].floatVector_.push_back( output[ att ].floatVector_[ indices[ theOneToChange ] * 3 + 2 ] ); // z								}								else								{									// *3 b/c we are looking up 3vectors in an array of floats									output[ att ].floatVector_.push_back( output[ att ].floatVector_[ indices[ theOneToChange ] * 3 + 0 ] ); // x									output[ att ].floatVector_.push_back( output[ att ].floatVector_[ indices[ theOneToChange ] * 3 + 1 ] ); // y									output[ att ].floatVector_.push_back( output[ att ].floatVector_[ indices[ theOneToChange ] * 3 + 2 ] ); // z								}							}						}                        IdenticalVertices_.push_back( EmptySet );                        IdenticalVertices_[ theNewIndex ].insert( indices[ theOneToChange ] );                        IdenticalVertices_[ indices[ theOneToChange ] ].insert( theNewIndex );						// point to where the new vertices will go						indices[ theOneToChange ] = theNewIndex;					}				}				} // for v			} // for f		} // if fix texgen		if (pTextureMatrix) {			const mat4 M(	pTextureMatrix[0],	pTextureMatrix[1],	pTextureMatrix[2],	pTextureMatrix[3],							pTextureMatrix[4],	pTextureMatrix[5],	pTextureMatrix[6],	pTextureMatrix[7],							pTextureMatrix[8],	pTextureMatrix[9],	pTextureMatrix[10],	pTextureMatrix[11],							pTextureMatrix[12],	pTextureMatrix[13],	pTextureMatrix[14],	pTextureMatrix[15]);    		Mapping::iterator texIter = outmap.find("tex0");			VertexAttribute::FloatVector& texcoords = output[(*texIter).second].floatVector_;			// now apply matrix			for (unsigned int v = 0; v < texcoords.size(); v += 3) {				vec3& V = *reinterpret_cast<vec3*>(&texcoords[v]);				V = V * M;			}		}    }	if ( bComputeTangentSpace )	{		Mapping::iterator texIter = outmap.find( "tex0" );        vec3* tex = (vec3*)&( output[ (*texIter).second ].floatVector_[ 0 ] );        typedef std::vector< vec3 > VecVector;        // create tangents        want = outmap.find( "tangent" );        if ( want == outmap.end() )		{	        VertexAttribute tanAtt;	        tanAtt.Name_ = "tangent";            output.push_back( tanAtt );            outmap[ "tangent" ] = output.size() - 1;            want = outmap.find( "tangent" );        }		// just initialize array so it's the correct size		output[ (*want).second ].floatVector_ = positions;        // create binormals        want = outmap.find( "binormal" );        if ( want == outmap.end() )		{	        VertexAttribute binAtt;	        binAtt.Name_ = "binormal";            output.push_back( binAtt );            outmap[ "binormal" ] = output.size() - 1;            want = outmap.find( "binormal" );        }		// just initialize array so it's the correct size	    output[ (*want).second ].floatVector_ = positions;        // Create a vector of s,t and sxt for each face of the model        VecVector sVector;        VecVector tVector;        VecVector sxtVector;        const unsigned int theSize = indices.size();		// for each face, calculate its S,T & SxT vector, & store its edges		for ( unsigned int f = 0; f < theSize; f += 3 )		{			vec3 edge0;			vec3 edge1;			vec3 s;			vec3 t;            // grap position & tex coords again in case they were reallocated            pPositions = (vec3*)( &( positions[ 0 ] ) );            tex = (vec3*)&( output[ (*texIter).second ].floatVector_[ 0 ] );			// create an edge out of x, s and t			edge0.x = pPositions[ indices[ f + 1 ] ].x - pPositions[ indices[ f ] ].x;			edge0.y = tex[ indices[ f + 1 ] ].x - tex[ indices[ f ] ].x;			edge0.z = tex[ indices[ f + 1 ] ].y - tex[ indices[ f ] ].y;			// create an edge out of x, s and t			edge1.x = pPositions[ indices[ f + 2 ] ].x - pPositions[ indices[ f ] ].x;			edge1.y = tex[ indices[ f + 2 ] ].x - tex[ indices[ f ] ].x;			edge1.z = tex[ indices[ f + 2 ] ].y - tex[ indices[ f ] ].y;			vec3 sxt = edge0 ^ edge1;            float a = sxt.x;            float b = sxt.y;            float c = sxt.z;            float ds_dx = nv_zero;            if ( fabs( a ) > nv_eps )            {                ds_dx = - b / a;            }            float dt_dx = nv_zero;            if ( fabs( a ) > nv_eps )            {                dt_dx = - c / a;            }			// create an edge out of y, s and t			edge0.x = pPositions[ indices[ f + 1 ] ].y - pPositions[ indices[ f ] ].y;			// create an edge out of y, s and t			edge1.x = pPositions[ indices[ f + 2 ] ].y - pPositions[ indices[ f ] ].y;			sxt = edge0 ^ edge1;            a = sxt.x;            b = sxt.y;            c = sxt.z;            float ds_dy = nv_zero;            if ( fabs( a ) > nv_eps )            {                ds_dy = -b / a;            }            float dt_dy = nv_zero;            if ( fabs( a ) > nv_eps )            {                dt_dy = -c / a;            }			// create an edge out of z, s and t			edge0.x = pPositions[ indices[ f + 1 ] ].z - pPositions[ indices[ f ] ].z;			// create an edge out of z, s and t			edge1.x = pPositions[ indices[ f + 2 ] ].z - pPositions[ indices[ f ] ].z;			sxt = edge0 ^ edge1;            a = sxt.x;            b = sxt.y;            c = sxt.z;            float ds_dz = nv_zero;            if ( fabs( a ) > nv_eps )            {                ds_dz = -b / a;            }            float dt_dz = nv_zero;            if ( fabs( a ) > nv_eps )            {                dt_dz = -c / a;            }            // generate coordinate frame from the gradients            s = vec3( ds_dx, ds_dy, ds_dz );            t = vec3( dt_dx, dt_dy, dt_dz );			s.normalize();			t.normalize();			sxt = s ^ t;			sxt.normalize();            // save vectors for this face            sVector.push_back( s );            tVector.push_back( t );            sxtVector.push_back( sxt );			if ( _FixTangents == FixTangents )			{				// Look for each edge of the triangle in the edge map, in order to find 				//  a neighboring face along the edge				for ( int e = 0; e < 3; ++e )				{					Edge edge;					int start = f + e;					int end = start + 1;					if ( e == 2 )					{						end = f;					}					// order vertex indices ( low, high )					edge.v0 = (unsigned int)nv_min( (nv_scalar)indices[ start ], (nv_scalar)indices[ end ] );					edge.v1 = (unsigned int)nv_max( (nv_scalar)indices[ start ], (nv_scalar)indices[ end ] );                    EdgeSet Edges;					EdgeSet::iterator iter = Edges.find( edge );					// if we are the only triangle with this edge...					if ( iter == Edges.end() )					{						// ...then add us to the set of edges						edge.face = f / 3;						Edges.insert( edge );					}					else					{						// otherwise, check our neighbor's s,t & sxt vectors vs our own						const float sAgreement = dot(s, sVector[(*iter).face]);						const float tAgreement = dot(t, tVector[(*iter).face]);						const float sxtAgreement = dot(sxt, sxtVector[(*iter).face]);						// Check Radian angle split limit						const float epsilon = (float)cos( bSmoothCreaseAngleRadians );						//  if the discontinuity in s, t, or sxt is greater than some epsilon,						//   duplicate the vertex so it won't smooth with its neighbor anymore						if ( ( fabs(   sAgreement ) < epsilon ) ||							 ( fabs(   tAgreement ) < epsilon ) ||							 ( fabs( sxtAgreement ) < epsilon ) )						{							// Duplicate two vertices of this edge for this triangle only.							//  This way the faces won't smooth with each other, thus							//  preventing the tangent basis from becoming degenerate							//  divide by 3 b/c vector is of floats and not vectors							const unsigned int theNewIndex = positions.size() / 3;							// Duplicate every part of the vertex							for ( unsigned int att = 0; att < output.size(); ++att )							{								// No new indices are created, just vertex attributes								if ( output[ att ].Name_ != "indices" )								{									// *3 b/c we are looking up 3vectors in an array of floats									output[ att ].floatVector_.push_back( output[ att ].floatVector_[ indices[ start ] * 3 + 0 ] ); // x									output[ att ].floatVector_.push_back( output[ att ].floatVector_[ indices[ start ] * 3 + 1 ] ); // y									output[ att ].floatVector_.push_back( output[ att ].floatVector_[ indices[ start ] * 3 + 2 ] ); // z									output[ att ].floatVector_.push_back( output[ att ].floatVector_[ indices[ end ] * 3 + 0 ] ); // x									output[ att ].floatVector_.push_back( output[ att ].floatVector_[ indices[ end ] * 3 + 1 ] ); // y									output[ att ].floatVector_.push_back( output[ att ].floatVector_[ indices[ end ] * 3 + 2 ] ); // z								}							}                            IdenticalVertices_.push_back( EmptySet );                            IdenticalVertices_.push_back( EmptySet );							// point to where the new vertices will go							indices[ start ] = theNewIndex;							indices[ end ] =   theNewIndex + 1;						}						// Now that the vertices are duplicated, smoothing won't occur over this edge,						//  because the two faces will sum their tangent basis vectors into separate indices 					}				}			} // if fixtangents		}        // Allocate std::vector & Zero out average basis for tangent space smoothing        VecVector avgS;        VecVector avgT;        for ( unsigned int p = 0; p < positions.size(); p += 3 )        {            avgS.push_back( vec3_null ); // do S            avgT.push_back( vec3_null ); // now t        }        //  go through faces and add up the bases for each vertex         const int theFaceCount = indices.size() / 3;        for ( unsigned int face = 0; face < (unsigned int)theFaceCount; ++face )        {            // sum bases, so we smooth the tangent space across edges            avgS[ pIndices[ face * 3 ] ] +=   sVector[ face ];            avgT[ pIndices[ face * 3 ] ] +=   tVector[ face ];            avgS[ pIndices[ face * 3 + 1 ] ] +=   sVector[ face ];            avgT[ pIndices[ face * 3 + 1 ] ] +=   tVector[ face ];            avgS[ pIndices[ face * 3 + 2 ] ] +=   sVector[ face ];            avgT[ pIndices[ face * 3 + 2 ] ] +=   tVector[ face ];        }        if ( _FixCylindricalTexGen == FixCylindricalTexGen )        {            for ( unsigned int v = 0; v < IdenticalVertices_.size(); ++v )            {                // go through each vertex & sum up it's true neighbors                for ( std::set< unsigned int >::iterator iter = IdenticalVertices_[ v ].begin();                      iter != IdenticalVertices_[ v ].end();                      ++iter )                {                    avgS[ v ] += avgS[ *iter ];                    avgT[ v ] += avgT[ *iter ];                }            }        }        Mapping::iterator tangent = outmap.find( "tangent" );        Mapping::iterator binormal = outmap.find( "binormal" );        // now renormalize        for ( unsigned int b = 0; b < positions.size(); b += 3 )         {            *reinterpret_cast<vec3*>(&output[(*tangent).second].floatVector_[b]) = normalize(avgS[b / 3]);  // s            *reinterpret_cast<vec3*>(&output[(*binormal).second].floatVector_[b]) = normalize(avgT[b / 3]);  // T        }	}	// At this point, tex coords, normals, binormals and tangents should be generated if necessary,	//  and other attributes are simply copied as available    return true;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -