private void PageVisibilityHandler(object sender, PageVisibilityEventArgs msg) { TerrainPage terrainPage = sender as TerrainPage; if (msg.visible) { // the page has become visible, so generate and assign the hilight mask texture Debug.Assert(terrainPage.HilightMask == null); SetRoadMask(terrainPage); } else { // the page is moving out of the visible area, so free up the mask textures if (terrainPage.HilightMask != null) { Texture hilightMask = terrainPage.HilightMask; terrainPage.HilightType = TerrainPage.PageHilightType.None; terrainPage.HilightMask = null; TextureManager.Instance.Unload(hilightMask); } } }
private void SetRoadMask(TerrainPage terrainPage) { // generate a texture from the mask PageCoord pc = new PageCoord(terrainPage.Location, TerrainManager.Instance.PageSize); byte[] byteMask = mask.GetMask(pc); if (byteMask != null) { Image maskImage = Image.FromDynamicImage(byteMask, mask.PageSize, mask.PageSize, PixelFormat.A8); String texName = String.Format("RoadMask-{0}", pc.ToString()); Texture texImage = TextureManager.Instance.LoadImage(texName, maskImage); terrainPage.HilightMask = texImage; terrainPage.HilightType = TerrainPage.PageHilightType.EdgeSharpBlend; } }
private void UpdateRoadMaskTextures() { int numPages = TerrainManager.Instance.PageArraySize; for (int x = 0; x < numPages; x++) { for (int z = 0; z < numPages; z++) { TerrainPage terrainPage = TerrainManager.Instance.LookupPage(x, z).TerrainPage; if ((terrainPage.HilightMask != null) && (terrainPage.HilightType == TerrainPage.PageHilightType.EdgeSharpBlend)) { terrainPage.HilightType = TerrainPage.PageHilightType.None; terrainPage.HilightMask.Dispose(); terrainPage.HilightMask = null; } SetRoadMask(terrainPage); } } }
/// <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(); }
/// <summary> /// Raise the page visibility event /// </summary> /// <param name="vis">true if the page is entering visible area, false if the page is leaving visible area</param> /// <param name="terrainPage">the page</param> private void OnPageVisibility(bool vis, TerrainPage terrainPage) { PageVisibilityEventHandler pageVis = PageVisibility; if (pageVis != null) { pageVis(terrainPage, new PageVisibilityEventArgs(vis, terrainPage.Location)); } }
private static String HighlightMaterialName(TerrainPage.PageHilightType type) { switch (type) { case TerrainPage.PageHilightType.None: default: return "MVSMTerrain"; case TerrainPage.PageHilightType.Colorized: return "MVSMTerrainColorizedHilight"; case TerrainPage.PageHilightType.EdgeBlend: return "MVSMTerrainEdgeBlendHilight"; case TerrainPage.PageHilightType.EdgeSharpBlend: return "MVSMTerrainEdgeSharpBlendHilight"; case TerrainPage.PageHilightType.EdgeSharp: return "MVSMTerrainEdgeSharpHilight"; } }