public TerrainPage(Vector3 location, Page page) { this.location = location; pageCoord = new PageCoord(location, TerrainManager.Instance.PageSize); terrainMaterial = TerrainManager.Instance.TerrainMaterialConfig.NewTerrainMaterial(pageCoord.X, pageCoord.Z); currentPage = page; Debug.Assert(location == currentPage.Location, "creating TerrainPage with page at different location"); numTiles = currentPage.NumTiles; patchSize = TerrainManager.Instance.PageSize / numTiles; // set up the page height maps for this page of terrain subPageSize = TerrainManager.Instance.SubPageSize; int subPagesPerPage = TerrainManager.Instance.PageSize / subPageSize; pageHeightMap = new PageHeightMap(subPagesPerPage, TerrainManager.Instance.PageSize, TerrainManager.Instance.MaxMetersPerSample, TerrainManager.Instance.MinMetersPerSample); pageHeightMap.Location = location; // create and position a scene node for this terrain page string nodeName = String.Format("TerrainPage[{0},{1}]", (int)(location.x / TerrainManager.oneMeter), (int)(location.z / TerrainManager.oneMeter)); // DEBUG - Console.WriteLine("Creating {0}", name); sceneNode = TerrainManager.Instance.WorldRootSceneNode.CreateChildSceneNode(nodeName); sceneNode.Position = location; sceneNode.AttachObject(this); // create the render operation renderOp = new RenderOperation(); renderOp.operationType = OperationType.TriangleList; renderOp.useIndices = true; CreatePatches(); SetCastShadows(); UpdateBounds(); TerrainManager.Instance.ShadowConfig.ShadowTechniqueChange += ShadowTechniqueChangeHandler; }
/// <summary> /// /// </summary> /// <param name="size">size of the terrain patch in meters</param> /// <param name="metersPerSample">meters per sample</param> /// <param name="pageHeightMap">which page heightmap to use to build the patch</param> /// <param name="startX">starting X offset of the patch within the page (in meters)</param> /// <param name="startZ">starting Z offset of the patch within the page (in meters)</param> public TerrainPatch(TerrainPage terrainPage, int size, int metersPerSample, int startX, int startZ) { this.terrainPage = terrainPage; patchSize = size; // save patch params this.pageHeightMap = terrainPage.PageHeightMap; this.metersPerSample = metersPerSample; this.startX = startX; this.startZ = startZ; patchLoc = new Vector3( terrainPage.Location.x + startX * TerrainManager.oneMeter, 0, terrainPage.Location.z + startZ * TerrainManager.oneMeter); numSamples = patchSize / metersPerSample; pageHeightMap.SetPatchLOD(startX, startZ, patchSize, metersPerSample); ComputeStitchSize(); }