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);
}
void MeshTopoData::SetCache(MNMesh &mesh, int mapChannel)
{
	FreeCache();
	this->mnMesh = new MNMesh(mesh);


	TVMaps.channel = mapChannel;

	BitArray s;
	mesh.getFaceSel(s);
	mesh.getFaceSel(mFSelPrevious);

	if ( (mesh.selLevel==MNM_SL_FACE) && (s == 0) ) 
	{
		TVMaps.SetCountFaces(0);
		TVMaps.v.SetCount(0);
		TVMaps.FreeEdges();
		TVMaps.FreeGeomEdges();
		mVSel.SetSize(0);
		mESel.SetSize(0);
		mFSel.SetSize(0);
		mGESel.SetSize(0);
		mGVSel.SetSize(0);
		return;
	}


	//get from mesh based on cahne
	int numMaps = mesh.MNum ();
	MNMapFace *tvFace=NULL;
	Point3 *tVerts = NULL;
	if (mapChannel >= numMaps) 
	{
	}
	else
	{
		tvFace = mesh.M(mapChannel)->f;
		tVerts = mesh.M(mapChannel)->v;
	}

	if (mesh.selLevel!=MNM_SL_FACE) 
	{
		//copy into our structs
		TVMaps.SetCountFaces(mesh.FNum());
		if (tVerts)
		{
			TVMaps.v.SetCount(mesh.M(mapChannel)->VNum());
			mVSel.SetSize(mesh.M(mapChannel)->VNum());
		}
		else
		{
			TVMaps.v.SetCount(mesh.VNum());
			mVSel.SetSize(mesh.VNum());
		}


		TVMaps.geomPoints.SetCount(mesh.VNum());

		for (int j=0; j<TVMaps.f.Count(); j++) 
		{
			TVMaps.f[j]->flags = 0;
			int fct;
			fct = mesh.f[j].deg;

			if (mesh.f[j].GetFlag(MN_DEAD)) fct = 0;

			if (fct > 0)
			{
				TVMaps.f[j]->t = new int[fct];
				TVMaps.f[j]->v = new int[fct];
			}
			else
			{
				TVMaps.f[j]->t = NULL;
				TVMaps.f[j]->v = NULL;
			}

			if (tvFace == NULL)
			{
				for (int k=0; k < fct;k++)
					TVMaps.f[j]->t[k] = 0;
				TVMaps.f[j]->FaceIndex = j;
				TVMaps.f[j]->MatID = mesh.f[j].material;
				TVMaps.f[j]->flags = 0;
				TVMaps.f[j]->count = fct;
				for (int k = 0; k < fct; k++)
				{
					int index = mesh.f[j].vtx[k];
					TVMaps.f[j]->v[k] = index;
					TVMaps.geomPoints[index] = mesh.v[index].p;
				}
			}
			else
			{
				for (int k=0; k < fct;k++)
					TVMaps.f[j]->t[k] = tvFace[j].tv[k];
				TVMaps.f[j]->FaceIndex = j;
				TVMaps.f[j]->MatID = mesh.f[j].material;


				TVMaps.f[j]->flags = 0;
				TVMaps.f[j]->count = fct;
				for (int k = 0; k < fct; k++)
				{
					int index = mesh.f[j].vtx[k];
					TVMaps.f[j]->v[k] = index;
					TVMaps.geomPoints[index] = mesh.v[index].p;
				}


			}
		}
		for ( int j=0; j<TVMaps.v.Count(); j++) 
		{
			TVMaps.v[j].SetFlag(0);
			if (tVerts)
				TVMaps.v[j].SetP(tVerts[j]);
			else TVMaps.v[j].SetP(Point3(.0f,0.0f,0.0f));
			TVMaps.v[j].SetInfluence(0.0f);
			TVMaps.v[j].SetControlID(-1);
		}
		if (tvFace == NULL) BuildInitialMapping(&mesh);

		TVMaps.mSystemLockedFlag.SetSize(TVMaps.v.Count());
		TVMaps.mSystemLockedFlag.ClearAll();

	}
	else
	{
		//copy into our structs
		TVMaps.SetCountFaces(mesh.FNum());

		int tvVertCount = 0;
		if (mapChannel < numMaps) 
		{
			tvVertCount = mesh.M(mapChannel)->VNum();
		}

		TVMaps.v.SetCount(tvVertCount);

		mVSel.SetSize(tvVertCount);

		TVMaps.geomPoints.SetCount(mesh.VNum());

		BitArray bs;
		mesh.getFaceSel(bs);

		for (int j=0; j<TVMaps.f.Count(); j++) 
		{
			TVMaps.f[j]->flags = 0;

			int fct;
			fct = mesh.f[j].deg;

			if (mesh.f[j].GetFlag(MN_DEAD)) fct = 0;


			if (fct > 0)
			{			
				TVMaps.f[j]->t = new int[fct];
				TVMaps.f[j]->v = new int[fct];
			}
			else
			{
				TVMaps.f[j]->t = NULL;
				TVMaps.f[j]->v = NULL;
			}

			if (tvFace == NULL)
			{
				for (int k=0; k < fct;k++)
					TVMaps.f[j]->t[k] = 0;
				TVMaps.f[j]->FaceIndex = j;
				TVMaps.f[j]->MatID = mesh.f[j].material;
				TVMaps.f[j]->count = fct;
				if (bs[j])
					TVMaps.f[j]->flags = 0;
				else TVMaps.f[j]->flags = FLAG_DEAD;
				for (int k = 0; k < fct; k++)
				{
					int index = mesh.f[j].vtx[k];
					TVMaps.f[j]->v[k] = index;
					TVMaps.geomPoints[index] = mesh.v[index].p;
				}
			}
			else
			{
				for (int k=0; k < fct;k++)
					TVMaps.f[j]->t[k] = tvFace[j].tv[k];
				TVMaps.f[j]->FaceIndex = j;
				TVMaps.f[j]->MatID = mesh.f[j].material;
				TVMaps.f[j]->count = fct;
				if (bs[j])
					TVMaps.f[j]->flags = 0;
				else TVMaps.f[j]->flags = FLAG_DEAD;
				for ( int k = 0; k < fct; k++)
				{
					int index = mesh.f[j].vtx[k];
					TVMaps.f[j]->v[k] = index;
					TVMaps.geomPoints[index] = mesh.v[index].p;
				}

			}
		}



		for (int j=0; j<TVMaps.v.Count(); j++) 
		{
			if (tVerts)
				TVMaps.v[j].SetP(tVerts[j]);
			else TVMaps.v[j].SetP(Point3(0.0f,0.0f,0.0f));
			//check if vertex for this face selected
			TVMaps.v[j].SetInfluence(0.0f);
			TVMaps.v[j].SetControlID(-1);

		}
		if (tvFace == NULL) BuildInitialMapping(&mesh);

		TVMaps.mSystemLockedFlag.SetSize(TVMaps.v.Count());
		TVMaps.mSystemLockedFlag.SetAll();

		for (int j=0; j<TVMaps.f.Count(); j++) 
		{
			if (!(TVMaps.f[j]->flags & FLAG_DEAD))
			{
				int a;
				for (int k =0 ; k < TVMaps.f[j]->count;k++)
				{
					a = TVMaps.f[j]->t[k];
					TVMaps.v[a].SetFlag(0);
					TVMaps.mSystemLockedFlag.Set(a,FALSE);
				}
			}
		}
	}
}