void MeshTopoData::ApplyMapping(PatchMesh &patch, int mapChannel)
{





	//get from mesh 

	if (!patch.getMapSupport(mapChannel) )
	{
		patch.setNumMaps (mapChannel+1);

	}

	TVPatch *tvFace = patch.tvPatches[mapChannel];


	int tvFaceCount =  patch.numPatches;

	if (patch.selLevel!=PATCH_PATCH) 
	{
		//copy into mesh struct
		if (!tvFace) 
		{
			// Create tvfaces and init to 0
			patch.setNumMapPatches(mapChannel,patch.getNumPatches());
			tvFace = patch.tvPatches[mapChannel];
			for (int k=0; k<patch.getNumPatches(); k++)
			{	
				for (int j=0; j<TVMaps.f[k]->count; j++) 
				{
					tvFace[k].tv[j] = 0;			
					tvFace[k].interiors[j] = 0;			
					tvFace[k].handles[j*2] = 0;			
					tvFace[k].handles[j*2+1] = 0;			
				}
			}
		}
		for (int k=0; k<tvFaceCount; k++) 
		{
			if (k < TVMaps.f.Count())
			{
				tvFace[k].tv[0] = TVMaps.f[k]->t[0];
				tvFace[k].tv[1] = TVMaps.f[k]->t[1];
				tvFace[k].tv[2] = TVMaps.f[k]->t[2];
				if (TVMaps.f[k]->count == 4) tvFace[k].tv[3] = TVMaps.f[k]->t[3];
				if (TVMaps.f[k]->flags & FLAG_CURVEDMAPPING)
				{
					patch.patches[k].flags &= ~PATCH_LINEARMAPPING;
					if (TVMaps.f[k]->vecs)
					{
						for (int m = 0;m < TVMaps.f[k]->count;m++)
						{
							if (TVMaps.f[k]->flags & FLAG_INTERIOR)
							{
								tvFace[k].interiors[m] = TVMaps.f[k]->vecs->interiors[m];			
							}

							tvFace[k].handles[m*2] = TVMaps.f[k]->vecs->handles[m*2];			
							tvFace[k].handles[m*2+1] = TVMaps.f[k]->vecs->handles[m*2+1];			
						}
					}

				}
				else patch.patches[k].flags |= PATCH_LINEARMAPPING;
			}
			else{
				tvFace[k].tv[0] = 0;
				tvFace[k].tv[1] = 0;
				tvFace[k].tv[2] = 0;
				if (TVMaps.f[k]->count == 4) tvFace[k].tv[3] = 0;
				for (int m = 0;m < TVMaps.f[k]->count;m++)
				{
					tvFace[k].interiors[m] = 0;			
					tvFace[k].handles[m*2] = 0;			
					tvFace[k].handles[m*2+1] = 0;			
				}

			}
		}
		//match verts
		patch.setNumMapVerts (mapChannel,TVMaps.v.Count());
		PatchTVert *tVerts = patch.tVerts[mapChannel];
		for (int k=0; k<TVMaps.v.Count(); k++) 
			tVerts[k].p = GetTVVert(k);
	}
	else
	{
		//copy into mesh struct
		if (!tvFace) 
		{
			// Create tvfaces and init to 0
			patch.setNumMapPatches (mapChannel,patch.getNumPatches());
			tvFace = patch.tvPatches[mapChannel];
			for (int k=0; k<patch.getNumPatches(); k++)
			{	
				for (int j=0; j<TVMaps.f[k]->count; j++) 
				{
					tvFace[k].tv[j] = 0;			
					tvFace[k].interiors[j] = 0;			
					tvFace[k].handles[j*2] = 0;			
					tvFace[k].handles[j*2+1] = 0;			

				}
			}
		}
		int offset = patch.getNumMapVerts (mapChannel);

		for (int k=0; k<tvFaceCount; k++) 
		{
			//copy if face is selected
			if (patch.patchSel[k])
			{
				tvFace[k].tv[0] = TVMaps.f[k]->t[0]+offset;
				tvFace[k].tv[1] = TVMaps.f[k]->t[1]+offset;
				tvFace[k].tv[2] = TVMaps.f[k]->t[2]+offset;
				if (TVMaps.f[k]->count == 4) tvFace[k].tv[3] = TVMaps.f[k]->t[3]+offset;
				if (TVMaps.f[k]->flags & FLAG_CURVEDMAPPING)
				{
					patch.patches[k].flags &= ~PATCH_LINEARMAPPING;
					if (TVMaps.f[k]->vecs)
					{
						for (int m = 0;m < TVMaps.f[k]->count;m++)
						{
							if (TVMaps.f[k]->flags & FLAG_INTERIOR)
							{
								tvFace[k].interiors[m] = TVMaps.f[k]->vecs->interiors[m]+offset;			
							}
							tvFace[k].handles[m*2] = TVMaps.f[k]->vecs->handles[m*2]+offset;			
							tvFace[k].handles[m*2+1] = TVMaps.f[k]->vecs->handles[m*2+1]+offset;			
						}
					}

				}
				else patch.patches[k].flags |= PATCH_LINEARMAPPING;
			}
		}
		//match verts
		patch.setNumMapVerts (mapChannel,TVMaps.v.Count()+offset,TRUE);
		PatchTVert *tVerts = patch.tVerts[mapChannel];
		for ( int k=0; k<TVMaps.v.Count(); k++) 
			tVerts[k+offset].p = GetTVVert(k);

	}
	RemoveDeadVerts(&patch,mapChannel);
}
void MeshTopoData::ApplyMapping(MNMesh &mesh, int mapChannel)
{
	// allocate texture verts. Setup tv faces into a parallel
	// topology as the regular faces
	int numMaps = mesh.MNum ();
	if (mapChannel >= numMaps) 
	{
		mesh.SetMapNum(mapChannel+1);
		mesh.InitMap(mapChannel);
	}

	MNMapFace *tvFace = mesh.M(mapChannel)->f;

	if (!tvFace)
	{
		mesh.InitMap(mapChannel);
		tvFace = mesh.M(mapChannel)->f;
	}

	int tvFaceCount =  mesh.FNum();

	if (mesh.selLevel!=MNM_SL_FACE) 
	{
		//copy into mesh struct

		for (int k=0; k<tvFaceCount; k++) 
		{
			if (k < TVMaps.f.Count())
			{
				for (int m = 0; m< TVMaps.f[k]->count; m++) 
					tvFace[k].tv[m] = TVMaps.f[k]->t[m];
			}
			else 
			{
				for (int m = 0; m< TVMaps.f[k]->count; m++) 
					tvFace[k].tv[m] = 0;
			}
		}
		//match verts
		mesh.M(mapChannel)->setNumVerts( TVMaps.v.Count());
		Point3 *tVerts = mesh.M(mapChannel)->v;
		for ( int k=0; k<TVMaps.v.Count(); k++) 
		{
			tVerts[k] = GetTVVert(k);
		}


	}
	else
	{
		//copy into mesh struct
		//check if mesh has existing tv faces
		int offset = mesh.M(mapChannel)->VNum();
		int current = 0;
		BitArray s;
		mesh.getFaceSel(s);
		for (int k=0; k<tvFaceCount; k++) 
		{
			//copy if face is selected
			if (s[k]==1)
			{
				for (int m = 0; m< TVMaps.f[k]->count; m++) 
					tvFace[k].tv[m] = TVMaps.f[k]->t[m] + offset;
			}
		}
		//add our verts
		for ( int k=0; k<TVMaps.v.Count(); k++) 
			mesh.M(mapChannel)->NewVert( GetTVVert(k));
	}
	mesh.M(mapChannel)->CollapseDeadVerts(mesh.f);
}