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 ); }
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; }