예제 #1
0
	int Object::createPlane( Material* mat , float w , float h , float* color , float xTile , float yTile , 
		                       Vector3 const& normal , Vector3 const& alignDir , Vector3 const& offset , bool invYDir )
	{
		Vector3 yLen =  normal.cross( alignDir );
		assert( yLen.length2() > 1e-4 );

		yLen.normalize();
		Vector3 xLen = yLen.cross( normal );

		xLen *= 0.5f * w;
		yLen *= 0.5f * h;

		if ( invYDir )
			yLen = -yLen;

		Vector3 n = normal;
		n.normalize();

		int texLen = 2;
		VertexType type = ( color ) ? CFVT_XYZ_N_CF1 : CFVT_XYZ_N;
		//VertexType type = ( color ) ? CFVT_XYZ_CF1 : CFVT_XYZ;

		MeshBuilder builder = MeshBuilder( type | CFVF_TEX1( 2 ) );

		if ( color )
			builder.setColor( color );

		builder.setNormal( n );

		builder.reserveVexterBuffer( 4 );
		builder.reserveIndexBuffer( 12 );

		builder.setPosition( offset - xLen - yLen );
		builder.setTexCoord( 0 , 0 , 0 );
		builder.addVertex();

		builder.setPosition( offset + xLen - yLen );
		builder.setTexCoord( 0 ,xTile, 0 );
		builder.addVertex();

		builder.setPosition( offset + xLen + yLen );
		builder.setTexCoord( 0 , xTile , yTile );
		builder.addVertex();

		builder.setPosition( offset - xLen + yLen );
		builder.setTexCoord( 0 , 0 , yTile );
		builder.addVertex();

		builder.addQuad( 0 , 1 , 2 , 3 );

		return builder.createIndexTrangle( this , mat );
	}
예제 #2
0
	static int fillModelMesh( MeshBuilder& builder , mstudiotexture_t& texDesc , short* tri  ,  Vector3 vtxPos[] , uint8* vtxBone )
	{
		int numTri = 0;

		float fs = 1.0f / texDesc.width;
		float ft = 1.0f / texDesc.height;
		int base = 0;

		if ( vtxBone )
		{
			while (1)
			{
				short nEle = *(tri++);
				if ( nEle == 0)
					break;

				if ( nEle < 0 )
				{
					//triangle fan
					nEle = -nEle;

					builder.setPosition(  vtxPos[ tri[0] ] );
					builder.setBlendIndices( vtxBone[ tri[0] ] + 1 );
					builder.setTexCoord( 0 , fs * tri[2] , ft * tri[3] );
					builder.addVertex();
					int start = base++;
					tri += 4;

					builder.setPosition(  vtxPos[ tri[0] ] );
					builder.setBlendIndices( vtxBone[ tri[0] ] + 1 );
					builder.setTexCoord( 0 , fs * tri[2] , ft * tri[3] );
					builder.addVertex();
					int prev = base++;
					tri += 4;

					for( int n = 2 ; n < nEle ; ++n )
					{
						builder.setPosition(  vtxPos[ tri[0] ] );
						builder.setBlendIndices( vtxBone[ tri[0] ] + 1 );
						builder.setTexCoord( 0 , fs * tri[2] , ft * tri[3] );
						builder.addVertex();

						int cur = base++;
						builder.addTriangle( start , cur , prev  );

						++numTri;

						prev = cur;
						tri += 4;
					}
				}
				else 
				{
					//triangle strip
					builder.setPosition(  vtxPos[ tri[0] ] );
					builder.setBlendIndices( vtxBone[ tri[0] ] + 1 );
					builder.setTexCoord( 0 , fs * tri[2] , ft * tri[3] );
					builder.addVertex();
					int prev2 = base++;
					tri += 4;

					builder.setPosition(  vtxPos[ tri[0] ] );
					builder.setBlendIndices( vtxBone[ tri[0] ] + 1 );
					builder.setTexCoord( 0 , fs * tri[2] , ft * tri[3] );
					builder.addVertex();
					int prev = base++;
					tri += 4;

					for( int n = 2 ; n < nEle ; ++n )
					{
						builder.setPosition(  vtxPos[ tri[0] ] );
						builder.setBlendIndices( vtxBone[ tri[0] ] + 1 );
						builder.setTexCoord( 0 , fs * tri[2] , ft * tri[3] );
						builder.addVertex();

						int cur = base++;

						if ( n % 2 == 0 )
							builder.addTriangle( prev2 , cur , prev );
						else
							builder.addTriangle( prev2  , prev , cur );

						++numTri;

						prev2 = prev;
						prev = cur;
						tri += 4;
					}
				}
			}
		}
		else //vtxBone
		{
			while (1)
			{
				short nEle = *(tri++);
				if ( nEle == 0)
					break;

				if ( nEle < 0 )
				{
					//triangle fan
					nEle = -nEle;

					builder.setPosition(  vtxPos[ tri[0] ] );
					builder.setTexCoord( 0 , fs * tri[2] , ft * tri[3] );
					builder.addVertex();
					int start = base++;
					tri += 4;

					builder.setPosition(  vtxPos[ tri[0] ] );
					builder.setTexCoord( 0 , fs * tri[2] , ft * tri[3] );
					builder.addVertex();
					int prev = base++;
					tri += 4;

					for( int n = 2 ; n < nEle ; ++n )
					{
						builder.setPosition(  vtxPos[ tri[0] ] );
						builder.setTexCoord( 0 , fs * tri[2] , ft * tri[3] );
						builder.addVertex();

						int cur = base++;
						builder.addTriangle( start , cur , prev  );

						++numTri;

						prev = cur;
						tri += 4;
					}
				}
				else 
				{
					//triangle strip
					builder.setPosition(  vtxPos[ tri[0] ] );
					builder.setTexCoord( 0 , fs * tri[2] , ft * tri[3] );
					builder.addVertex();
					int prev2 = base++;
					tri += 4;

					builder.setPosition(  vtxPos[ tri[0] ] );
					builder.setTexCoord( 0 , fs * tri[2] , ft * tri[3] );
					builder.addVertex();
					int prev = base++;
					tri += 4;

					for( int n = 2 ; n < nEle ; ++n )
					{
						builder.setPosition(  vtxPos[ tri[0] ] );
						builder.setTexCoord( 0 , fs * tri[2] , ft * tri[3] );
						builder.addVertex();

						int cur = base++;

						if ( n % 2 == 0 )
							builder.addTriangle( prev2 , cur , prev );
						else
							builder.addTriangle( prev2 , prev , cur );

						++numTri;

						prev2 = prev;
						prev = cur;
						tri += 4;
					}
				}
			}
		}
		return numTri;
	}