void CChangeMoveMapData::MoveAsMap( const int nStartReginX, const int nStartReginZ, const int nOffsetReginWidth, const int nOffsetReginDepth )
	{
		this->ClearInfo();

		COperator *pOperator = CMapEditApp::GetInst()->GetOperator();

		int nGridCount = terrain->GetGridCount();
		int nVertexCount = terrain->GetVertexCount();
		int nMapWidth  = terrain->GetWidth();
		int nNewGridIndex = 0, nOldGridIndex = 0;//nOldGridIndex为原始地表格子索引,nNewGridIndex为偏移后地表格子索引
		int nOldVertexIndex = 0, nNewVertexIndex = 0;
		int nXOffsetGridCount = nOffsetReginWidth * REGION_SPACE;
		int nZOffsetGridCount = nOffsetReginDepth * REGION_SPACE;
		int nStartRegionGridStartX   = nStartReginX * REGION_SPACE;
		int nStartRegionGridStartZ   = nStartReginZ * REGION_SPACE;
		map<int, SGrid> mapTempTerrainGridInfo;///将所有老格子上的信息传先暂时保存下来
		map<int, SVertex> mapTempTerrainVertexInfo;///将所有老顶点上的信息传先暂时保存下来
		map<int, SGrid> mapTempWaterGridInfo;///将所有老格子上的信息传先暂时保存下来
		map<int, SVertex> mapTempWaterVertexInfo;///将所有老顶点上的信息传先暂时保存下来

		CTerrainMesh *pWater = terrain->GetWater();

		for( int m = 0; m < nZOffsetGridCount; ++m )
		{
			int nOldDepth = nStartRegionGridStartZ + m;
			int nNewDepth = nStartRegionGridStartZ + m + m_nMapZMoveOffset;
			for ( int n = 0; n < nXOffsetGridCount; ++n )
			{
				int nOldGridIndex = n + nStartRegionGridStartX + nOldDepth * nMapWidth;
				int nNewGridIndex = n + nStartRegionGridStartX + m_nMapXMoveOffset + nNewDepth * nMapWidth;

				//DebugOut("old %d, new %d\n", nOldGridIndex, nNewGridIndex);
				mapOldMapGridIndex[nOldGridIndex] = nNewGridIndex;
				
				if( terrain->IsValid(nOldGridIndex) && terrain->IsValid(nNewGridIndex) )
				{
					SGrid OldTerrainGrid = terrain->GetGrid(nOldGridIndex);
					SGrid OldWaterGrid   = pWater->GetGrid(nOldGridIndex);
					SGrid *pNewGrid      = &terrain->GetGrid(nNewGridIndex);

					mapTempTerrainGridInfo[nOldGridIndex] = OldTerrainGrid;
					mapTempWaterGridInfo[nOldGridIndex]   = OldWaterGrid;
					
					for( int i = 0; i < 4; ++i )
					{
						nOldVertexIndex = OldTerrainGrid.dwVertexIndex[i];
						nNewVertexIndex = pNewGrid->dwVertexIndex[i];
						mapOldMapVertexIndex[nOldVertexIndex] = nNewVertexIndex;

						SVertex TerrainVertex = terrain->GetVertex(nOldVertexIndex);
						mapTempTerrainVertexInfo[nOldVertexIndex] = TerrainVertex;
						SVertex WaterVertex = pWater->GetVertex(nOldVertexIndex);
						mapTempWaterVertexInfo[nOldVertexIndex] = WaterVertex;
					}
				}
			}
		}

		map<int, SVertex>::iterator vertexiter;
		map<int, int>::iterator vertexbeg = mapOldMapVertexIndex.begin();
		map<int, int>::iterator vertexend = mapOldMapVertexIndex.end();
		set<int> newHasMoveVertexIndexs;//记录哪些顶点移动了,移动后新顶点的索引
		for ( vertexbeg; vertexbeg != vertexend; ++vertexbeg )
		{
			nOldVertexIndex = vertexbeg->first;
			nNewVertexIndex = vertexbeg->second;
			newHasMoveVertexIndexs.insert(nNewVertexIndex);

			vertexiter = mapTempTerrainVertexInfo.find(nOldVertexIndex);
			if( vertexiter != mapTempTerrainVertexInfo.end() )
			{
				if (terrain->IsValidVertexIndex(nNewVertexIndex))
				{
					SVertex Vertex = vertexiter->second;
					SVertex &newvertex = terrain->GetVertex(nNewVertexIndex);

					newvertex.vPosition.y	 = Vertex.vPosition.y;
					newvertex.oColor	     = Vertex.oColor;
					newvertex.sColor		 = Vertex.sColor;
					newvertex.vNormal		 = Vertex.vNormal;
					newvertex.fLogicHeight   = Vertex.fLogicHeight;

					pWater->GetVertex(nNewVertexIndex).vPosition.y = newvertex.vPosition.y + WATER_LAYER_BASE;

					if( newHasMoveVertexIndexs.find(nOldVertexIndex) == newHasMoveVertexIndexs.end() )
					{
						SVertex &oldvertex = terrain->GetVertex(nOldVertexIndex);
						oldvertex.vPosition.y	 = 0.0f;
						oldvertex.oColor		 = VERTEX_COLOR;
						oldvertex.sColor		 = 0;
						oldvertex.vNormal		 = CVector3f(0.0f,1.0f,0.0f);
						oldvertex.fLogicHeight	 = 0.0f;
						pWater->GetVertex(nOldVertexIndex).vPosition.y = WATER_LAYER_BASE;
					}
				}
			}
		}

		string strDefaultTerrainTexName = terrain->GetTerrainDefaultTextureName();

		map<int, int>::iterator beg = mapOldMapGridIndex.begin();
		map<int, int>::iterator end = mapOldMapGridIndex.end();
		map<int, SGrid>::iterator iter;
		set<int> newHasMoveGridIndexs;//记录哪些格子移动了,移动后新格子的索引
		set<int>::iterator iiter;
		for ( beg; beg != end; ++beg )
		{
			nOldGridIndex = beg->first;
			nNewGridIndex = beg->second;
			newHasMoveGridIndexs.insert(nNewGridIndex);

			iter = mapTempTerrainGridInfo.find(nOldGridIndex);
			if( iter != mapTempTerrainGridInfo.end() )
			{
				if( terrain->IsValid(nNewGridIndex) )
				{
					SGrid oldGrid = iter->second;
					SGrid &grid = terrain->GetGrid(nNewGridIndex);
					grid.ClearGridInfo();
					{
						grid.pRiver				  = oldGrid.pRiver;
						grid.pWave				  = oldGrid.pWave;
						grid.vecCenterObjects	  = oldGrid.vecCenterObjects;
	
						grid.bReverse			  = oldGrid.bReverse;
						grid.bEffectByVertexColor = oldGrid.bEffectByVertexColor;
						grid.bCliffLayerOne		  = oldGrid.bCliffLayerOne;
						grid.bGridHide			  = oldGrid.bGridHide;
						grid.nGridSeekRoadWeight  = oldGrid.nGridSeekRoadWeight;
						grid.m_bSetExactBlock	  = oldGrid.m_bSetExactBlock;
						grid.nMaterialIndex		  = oldGrid.nMaterialIndex;
						grid.nBlockType			  = oldGrid.nBlockType;

						grid.bMatNotEffectByTileSets = oldGrid.bMatNotEffectByTileSets;///强行设置该格子不受图素包设置影响,默认为受影响

						grid.nMaterialIndex			 = oldGrid.nMaterialIndex;
						grid.bSide					 = oldGrid.bSide;

						for ( int i = 0; i < 4; ++i )
						{
							grid.subGridTypes[i] = oldGrid.subGridTypes[i];
							grid.nodeInfo.strTextureNames[i] = oldGrid.nodeInfo.strTextureNames[i];
						}

						grid.vCenter.y = oldGrid.vCenter.y;
						grid.pRiver = oldGrid.pRiver;

						for ( vector< CTObjectPtr >::iterator iter = oldGrid.vecCenterObjects.begin(); iter != oldGrid.vecCenterObjects.end(); ++iter )
						{
							CEditModelGroup *pModelGroup = NULL;
							pModelGroup = (*iter)->GetModelGroup();

							string strEffectName = "";
							string strCueName = pModelGroup->GetSceneCueName();
							string strItemName = pModelGroup->GetItemName();
							bool bEffectBased = pModelGroup->GetIsEffectBased();
							bool bEffecIsExit = pModelGroup->GetEffectName(strEffectName);
							int nAtten = pModelGroup->GetAtten();
							int nRatio = pModelGroup->GetAffectRatio();
							bool bPointLight = false, bSpotLight = false;

							if (pModelGroup->m_SL.m_bIAmbScenePointLight)
								bPointLight = true;

							if (pModelGroup->m_SpotLight.m_bIAmbSceneSpotLight)
								bSpotLight = true;

							///一段时间的播放长度最小最大值
							DWORD dwPlayLenMin = pModelGroup->GetPlayTimeLenMin();
							DWORD dwPlayLenMax = pModelGroup->GetPlayTimeLenMax();

							///二段播放间隔长度最小最大值
							DWORD dwPlayIntervalMin = pModelGroup->GetPlayIntervalMin();
							DWORD dwPlayIntervalMax = pModelGroup->GetPlayIntervalMax();

							CMapEditObject *pMapEditObject = NULL;
							pMapEditObject = pModelGroup->GetSelfPresentation(0);
							if( pModelGroup == NULL )
							{
								MessageBox(NULL,"没有模型,不保存","",MB_OK);
								return;
							}

							MoldeSaveProperty sModelSavePro = pMapEditObject->sModelSavePro;
							sModelSavePro.nCenterGridIndex = nNewGridIndex;

							if ( bEffectBased && bEffecIsExit )
							{
								pOperator->RebirthIndividualEffect(strEffectName, sModelSavePro.nCenterGridIndex, sModelSavePro.vRotate.y, sModelSavePro.nRotationCnt,
									sModelSavePro.vRotate.z, sModelSavePro.nPitchCnt, sModelSavePro.vRotate.x, sModelSavePro.nYawCnt, sModelSavePro.vScale.x, sModelSavePro.vScale.y, sModelSavePro.vScale.z, &sModelSavePro.vUserOffsetEx, sModelSavePro.vPosition, 0, NULL, 0);
				
							}
							else // effect
							{
								if( strCueName != "" )
								{
									EAUTO_GENERATION_TYPE eAutoGenerationType = EAGT_NONE;
									BYTE byRenderStyle = 0;
									bool bShadow = true;
									bool bReceiveShadow = false;
									BYTE bTransState = 0;
									int nMirrorType = 0, nRatio = 0;
									bool bTrans = true;
									CVector3f vUserOffsetEx2 = CVector3f(sModelSavePro.vUserOffsetEx.y,sModelSavePro.vUserOffsetEx.x,sModelSavePro.vUserOffsetEx.z);

									pOperator->Rebirth(strItemName, sModelSavePro.nCenterGridIndex, sModelSavePro.vRotate.y, sModelSavePro.nRotationCnt,
										sModelSavePro.vRotate.z, sModelSavePro.nPitchCnt, sModelSavePro.vRotate.x, sModelSavePro.nYawCnt, sModelSavePro.vScale.x, sModelSavePro.vScale.y, sModelSavePro.vScale.z, &vUserOffsetEx2, 0, NULL, 0,0,1.0f,
										eAutoGenerationType,byRenderStyle,nAtten,false,bShadow,bTrans,bTransState,nMirrorType,nRatio, "", strItemName, strCueName);
								}
								else
									pOperator->Rebirth(&sModelSavePro, strItemName, "", nRatio, strItemName, strCueName);
							}

							size_t size = grid.vecCenterObjects.size();
							CEditModelGroup *pNewModelGroup = NULL;
							CTObjectPtr p = grid.vecCenterObjects[size-1];
							pNewModelGroup = p->GetModelGroup();
							if( pNewModelGroup )
							{
								if( bPointLight )
								{
									pNewModelGroup->m_SL = pModelGroup->m_SL;
									pNewModelGroup->SetIsLightEffect(true);

									iiter = terrain->m_DynamicLightGrids.find(nOldGridIndex);
									if ( iiter != terrain->m_DynamicLightGrids.end() )
										terrain->m_DynamicLightGrids.erase(iiter);
									terrain->m_DynamicLightGrids.insert(nNewGridIndex);
								}
								else
								{
									if( bSpotLight )
									{
										pNewModelGroup->m_SpotLight = pModelGroup->m_SpotLight;
										pNewModelGroup->SetIsLightEffect(true);
									}
									else
									{
										if( strCueName != "" )
										{
											if( pModelGroup->m_pSceneAudio )
											{
												if( pNewModelGroup->m_pSceneAudio == NULL )
													pNewModelGroup->m_pSceneAudio = new SceneAudio;

												pNewModelGroup->SetSceneCueName(strCueName);

												DWORD time = pModelGroup->GetPlayTimeLenMin();
												pNewModelGroup->SetPlayTimeLenMin(time);

												time = pModelGroup->GetPlayTimeLenMax();
												pNewModelGroup->SetPlayTimeLenMax(time);

												time = pModelGroup->GetPlayIntervalMin();
												pNewModelGroup->SetPlayIntervalMin(time);

												time = pModelGroup->GetPlayIntervalMax();
												pNewModelGroup->SetPlayIntervalMax(time);

											}
										}
									}
								}
							}
						}
					}

					if( newHasMoveGridIndexs.find(nOldGridIndex) == newHasMoveGridIndexs.end() )
					{
						SGrid &oldgrid = terrain->GetGrid(nOldGridIndex);
						oldgrid.pWave = NULL;
						oldgrid.ClearGridInfo();
						oldgrid.nodeInfo.strTextureNames[0] = strDefaultTerrainTexName;
					}
				}
			}
		}

		//////////////////////////////////////////////////////////////////////////
		///water
		set<int> setGridIndicesVisibleWater = pWater->GetGridIndicesVisibleWater();
		map< CRiver*, vector<int> > mapRivers;
		for ( set<int>::iterator iter = setGridIndicesVisibleWater.begin(); iter != setGridIndicesVisibleWater.end();)
		{
			int nGridIndex = *iter;
			++iter;

			SGrid & gridW = pWater->GetGrid(nGridIndex);
			Ast(gridW.bVisible);
			if ( gridW.pRiver )
			{
				mapRivers[gridW.pRiver].push_back(nGridIndex);
			}
		}

		CWaterOperator* pWaterOperator = CMapEditApp::GetInst()->GetWaterOperator();

		vector<int> vecGridIndicesRiver;
		for ( map< CRiver*, vector<int> >::iterator iterMapRivers = mapRivers.begin(); iterMapRivers != mapRivers.end(); ++iterMapRivers )
		{
			CRiver * pRiver = iterMapRivers->first;
			string strItemName = pRiver->GetItemName();
			pWaterOperator->RebirthRiver(strItemName);

			for (size_t i = 0; i < iterMapRivers->second.size(); ++i  )
			{
				int nOldGridIndex = iterMapRivers->second[i];///移动前的格子索引
				int nNewGridIndex = mapOldMapGridIndex[nOldGridIndex];///移动后的格子索引

				iter = mapTempTerrainGridInfo.find(nOldGridIndex);
				if( iter != mapTempTerrainGridInfo.end() )
				{
					if( terrain->IsValid(nNewGridIndex) )
					{
						SGrid &gridOldW = mapTempWaterGridInfo[nOldGridIndex];
						SGrid &gridNewW = pWater->GetGrid(nNewGridIndex);

						gridOldW.pRiver = NULL;
						vecGridIndicesRiver.push_back(nNewGridIndex);

						pWater->EraseGridIndexVisibleWater(nOldGridIndex);
						//pWater->InsertGridIndexVisibleWater(nNewGridIndex);

						for ( int j = 0; j < 4; ++j )
						{
							int nOldVertexIndex = gridOldW.dwVertexIndex[j];
							SVertex &OldVertex  = mapTempWaterVertexInfo[nOldVertexIndex];

							int nNewVertexIndex = gridNewW.dwVertexIndex[j];
							SVertex &NewVertex  = pWater->GetVertex(nNewVertexIndex);

							NewVertex.vPosition.y = OldVertex.vPosition.y;
							NewVertex.oColor	  = OldVertex.oColor;

							//OldVertex.vPosition.y = WATER_LAYER_BASE;
							//OldVertex.oColor	  = WATER_COLOR;
							//OldVertex.vNormal	  = CVector3f(0.0, 1.0f, 0.0f);
						}
					}
				}
			}
		}
		size_t size = vecGridIndicesRiver.size();
		for (size_t i = 0; i < size; ++i )
		{
			pWater->AdjustWaterMeshVisibility(vecGridIndicesRiver[i],true);
		}

		this->ChangeRegionLightInfo();
		//////////////////////////////////////////////////////////////////////////

		terrain->ReWriteTerrainBuffer(terrain->m_TerrainBufferIndexs, 0);
		terrain->ReWriteTerrainBuffer(terrain->m_TerrainBufferIndexs, 1);
		terrain->ReWriteTerrainBuffer(terrain->m_TerrainBufferIndexs, 2);
		terrain->ReWriteTerrainBuffer(terrain->m_TerrainBufferIndexs, 3);
		terrain->ReWriteTerrainBuffer(terrain->m_TerrainBufferIndexs, 4);
		terrain->ReWriteTerrainBuffer(terrain->m_TerrainBufferIndexs, 5);
	}