Exemple #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 );
	}
// Builds one square
void buildSquare(Object &object, const GLfloat side, MeshBuilder & builder) {
    builder.addVertex(-side, -side, 0); // bottom left
    builder.addVertex(side, -side, 0); // bottom right
    builder.addVertex(-side, side, 0); // top left
    builder.addVertex(side, side, 0); // top right
    builder.addFace(0, 2, 3); // First triangle : top left
    builder.addFace(0, 1, 3); // Second triangle : bottom right

    vector<unsigned int> indices;
    vector<Vector3f> vertices;
    vector<Vector3f> normals;
    vector<UV> uvs;

    builder.unpack(indices, vertices, normals, uvs);

    // Sends the data into buffers on the GPU
    object.sendPrimitives(vertices, indices);
}
Exemple #3
0
static int test()
{
	MeshBuilder mesh;
	Vertex* v[4];
	int i;
	for ( i = 0 ; i < 4 ; ++i )		// 0 1
		v[i] = mesh.addVertex();	// 3 2

	Polygon* a = mesh.addPolygon();
	a->addVertex( v[0] );
	a->addVertex( v[1] );
	a->addVertex( v[2] );

	Polygon* b = mesh.addPolygon();
	b->addVertex( v[0] );
	b->addVertex( v[2] );
	b->addVertex( v[3] );

	VertexMap* vmap = mesh.addVertexMap( 2, "TXUV", VertexMapFormat::VERTEXMAP_TEXCOORD );
	float uv[4][2] = { {0, 0}, {1,0}, {1,1}, {0,1} };
	vmap->addValue( v[2]->index(), uv[2], 2 );
	vmap->addValue( v[1]->index(), uv[1], 2 );
	vmap->addValue( v[3]->index(), uv[3], 2 );
	vmap->addValue( v[0]->index(), uv[0], 2 );

	v[1] = a->getVertex(1)->clone();
	a->setVertex( 1, v[1] );
	assert( mesh.vertices() == 5 );

	float uv1[4][2];
	memset( uv1, 0, sizeof(uv1) );
	for ( i = 0 ; i < 4 ; ++i )
	{
		vmap->getValue( v[i]->index(), uv1[i], 2 );
		assert( !memcmp(uv[i],uv1[i],sizeof(uv[i])) );
	}

	assert( vmap->dimensions() == 2 );
	assert( vmap->name() == "TXUV" );
	return 0;
}
Exemple #4
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;
	}