/// <summary> /// Initializes a new instance of the DigitalElevationMap class. /// </summary> /// <param name="mapSize">Size of the map</param> /// <param name="rDb"></param> /// <param name="devIf"></param> /// <param name="reader"></param> public DigitalElevationMap(Size mapSize, RasterDatabase.RasterDatabase rDb, DeviceInterface devIf, GDALReader reader) : base(new Vector3(-5f, -0.5f, -5f), new Vector3(5f, 1f, 5f)) { this.mapSize = mapSize; maxDimension = mapSize.Width > mapSize.Height ? mapSize.Width : mapSize.Height; this.rDb = rDb; this.devIf = devIf; this.reader = reader; axisHelper = new Axis3DHelper(new Vector3(2.5f, 0.5f, 2.5f)); rotAxisHelper = new RotationAxis3DHelper(new Vector3()); }
public static GpuDemGeometry CreateGeometry(RasterDatabase.RasterDatabase rDatabase, Device gDevice, out float maxValue, GDALReader reader) { // create actual geometry - tesselated plane IndexBuffer geomPlaneIndices; PlaneHelper.CreateIndexBuffer(gDevice, 14, 14, out geomPlaneIndices); VertexBuffer geomPlaneVerts; PlaneHelper.CreateVertexBufferInside(gDevice, 16, 16, new Vector2(1, 1), out geomPlaneVerts); VertexBuffer geomPatchVerts; PlaneHelper.CreatePatchVertexBuffer(gDevice, 16, 16, new Vector2(1, 1), out geomPatchVerts); IndexBuffer geomPatchIndices; PlaneHelper.CreatePatchIndexBuffer(gDevice, 16, 16, out geomPatchIndices); // create cache of all depths RectangleGroupQuadTree rTree = rDatabase.ProduceLayerMipMap(0, 256); RectangleGroupQuadTree.GroupNode[][] dataNodes = new RectangleGroupQuadTree.GroupNode[rTree.Depth][]; for (int depth = 0; depth < rTree.Depth; depth++) { RectangleGroupQuadTree.GroupNode[] nodes; rTree.GetNodes(depth + 1, out nodes); dataNodes[depth] = nodes; } GpuDemGeometry geom = new GpuDemGeometry(new Vector3(), new Vector3(10, 0, 10), new Vector3(5, 0, 5), 16 * 16, 15 * 15 * 2, PrimitiveType.TriangleList, gDevice); geom.geomPlaneVerts = geomPlaneVerts; geom.geomPlaneIndices = geomPlaneIndices; geom.geomPatchIndices = geomPatchIndices; geom.geomPatchVerts = geomPatchVerts; geom.reader = reader; geom.dataNodes = dataNodes; geom.ViewUpdated(new Vector3()); maxValue = 1; return(geom); }
public static CpuDemGeometry CreateGeometry(RasterDatabase.RasterDatabase rDatabase, Device gDevice, out float maxValue) { // TODO: Still some atifact problems? // just use default LOD for now RectangleGroupQuadTree rTree = rDatabase.ProduceLayerMipMap(0, maxRes); maxValue = rTree.MaxDataValue; // use bottom level only for now RectangleGroupQuadTree.GroupNode[] nodes; rTree.GetNodes(rTree.Depth, out nodes); // create sub-geometry for each node/area CpuDEMSubGeometry[] subGeometry = new CpuDEMSubGeometry[nodes.Length]; for (int i = 0; i < nodes.Length; i++) { subGeometry[i] = CpuDEMSubGeometry.CreatePointList(nodes[i], gDevice, maxRes / numSamples, rDatabase.Layers[0].Area.Size, rTree.MinDataValue, rTree.MaxDataValue); } // TODO: Produce diffuse-maps (etc.) for the tree IndexBuffer[] iBuffers = CpuDEMSubGeometry.CreateSampleTriStripsIndices(numSamples, numSamples, gDevice); CpuDemGeometry geom = new CpuDemGeometry(new Vector3(), new Vector3(), new Vector3(), 0, 0, PrimitiveType.PointList, gDevice); geom.subGeometry = subGeometry; geom.iBuffers = iBuffers; geom.tex = new Texture[nodes.Length]; geom.rTree = rTree; geom.nodes = nodes; geom.iBuffersLong2 = CpuDEMSubGeometry.CreateSampleTriStripsIndices(numSamples + 1, numSamples + 1, gDevice); return(geom); }
public void LoadVisualization(DataProfile dataProfile, DataProfile.SubProfile subProfile, IDataSourceReader dataSrcReader, DataSourceInfo dataSrcInfo) { renderFrame = true; renderingThread.Start(); controlStatus = ControlStatus.Loading; rContext.LoadingLayer.SetProgress(0); rContext.LoadingLayer.SetText("Loading... DEM Geometry"); rContext.LoadingLayer.Visible = true; Render(); // load data from dlg into database database = new RasterDatabase.RasterDatabase(); object filteredData = subProfile.Filter.FilterData(dataSrcReader); if (filteredData is byte[]) { DataLayer dataLayer = new DataLayer("DEM", 8, "byte"); dataLayer.AddArea(new ByteArea(new Rectangle(new Point(), dataSrcReader.Info.Resolution), new RectangleF(0, 0, 1, 1), (byte[])filteredData, dataSrcReader.Info.Resolution)); database.AddLayer(dataLayer); } else if (filteredData is float[]) { DataLayer dataLayer = new DataLayer("DEM", 32, "float"); dataLayer.AddArea(new FloatArea(new Rectangle(new Point(), dataSrcReader.Info.Resolution), new RectangleF(0, 0, 1, 1), (float[])filteredData, dataSrcReader.Info.Resolution)); database.AddLayer(dataLayer); } // load data source(s) DataSourceItem item = new DataSourceItem(dataSrcInfo.BppType, (Bitmap)PreviewRasterizer.DrawRotatedBandPreview(dataSrcInfo.Bands, 64, dataSrcInfo)); heightDataSrcs.Add(item); // load diffuse sources // grey-scale for height GreyScaleDEMSampler srcImgSampler = new GreyScaleDEMSampler(); Bitmap srcImg = srcImgSampler.GenerateBitmap(new Size(64, 64), database.Layers[0].Areas[0]); item = new DataSourceItem("Height", srcImg); item.DEMSampler = srcImgSampler; //(Bitmap)PreviewRasterizer.DrawRotatedBandPreview(new DataSourceInfo.DataBandInfo[] { new DataSourceInfo.DataBandInfo("Source", srcImg) }, //64, null)); diffuseDataSrcs.Add(item); // load colour image if possible as other source (i.e the original if an RGB img) if (dataSrcReader.Info.SupportsRGB()) { item = new DataSourceItem("SourceRGB", SourceDataDiffuseSampler.SampleRGBDiffuseMap((GDALReader)dataSrcReader, new Size(64, 64))); diffuseDataSrcs.Add(item); reader = (GDALReader)dataSrcReader; } // height band range HeightBandRange hbr = new HeightBandRange(); hbr.AddBand(0, Color.DarkGreen); hbr.AddBand(0.25f, Color.Blue); hbr.AddBand(0.4f, Color.DarkGreen); hbr.AddBand(0.5f, Color.Green); hbr.AddBand(0.8f, Color.Gray); hbr.AddBand(1, Color.White); HeightBandDEMSampler hBandSampler = new HeightBandDEMSampler(hbr); item = new DataSourceItem("HeightBands", hBandSampler.GenerateBitmap(new Size(64, 64), database.Layers[0].Areas[0])); item.DEMSampler = hBandSampler; diffuseDataSrcs.Add(item); // load database into visualization dem = new DigitalElevationMap(database.Area.Size, database, rContext.DevIf, (GDALReader)dataSrcReader/*, * hBandSampler.GenerateBitmap(new Size(512, 512), * database.Layers[0].Areas[0])*/ ); rContext.SetDEM(dem); // setup geometry layers geometryLayers.Add(new GeometryVisLayer("Diffuse", item.Thumbnail, true)); geometryLayers.Add(new GeometryVisLayer("Overlay Grid", null, true)); rContext.DevIf.LocalSettings["GeometryVisLayer.Diffuse"] = geometryLayers[0]; rContext.DevIf.LocalSettings["GeometryVisLayer.Overlay"] = geometryLayers[1]; // now load default texture SetDiffuseSource(0); rContext.LoadingLayer.SetProgress(100); Render(); Thread.Sleep(500); rContext.LoadingLayer.Visible = false; controlStatus = ControlStatus.Idle; Render(); }
public static TextureMatrixLayer[] RenderDatabaseTree(RasterDatabase.RasterDatabase db, Device device) { // setup device device.RenderState.ZBufferEnable = false; device.Indices = null; device.VertexFormat = CustomVertex.TransformedTextured.Format; //device.Transform.World = Matrix.Identity; Surface rt0 = device.GetRenderTarget(0); // setup template quad CustomVertex.TransformedTextured[] tQuad = new CustomVertex.TransformedTextured[4]; foreach (DataLayer layer in db.Layers) { RectangleGroupQuadTree tree = db.ProduceLayerMipMap(layer, 2048); Texture[][] textures = new Texture[tree.Depth][]; for (int i = 1; i <= tree.Depth; i++) { RectangleGroupQuadTree.GroupNode[] nodes; tree.GetNodes(i, out nodes); textures[i] = new Texture[nodes.Length]; // render each node to texture int texIdx = 0; foreach (RectangleGroupQuadTree.GroupNode node in nodes) { Texture texture = textures[i][texIdx++] = new Texture(device, node.NodeArea.Width, node.NodeArea.Height, 0, Usage.WriteOnly, Format.X8R8G8B8, Pool.Managed); device.SetRenderTarget(0, texture.GetSurfaceLevel(0)); device.Clear(ClearFlags.Target, Color.Black, 1, 0); device.BeginScene(); // draw each rectangle quad foreach (DataArea area in node.Rectangles) { // setup quad tQuad[0] = new CustomVertex.TransformedTextured(area.Area.Left, area.Area.Top, 1, 1, area.TexCoords.Left, area.TexCoords.Top); tQuad[1] = new CustomVertex.TransformedTextured(area.Area.Right, area.Area.Top, 1, 1, area.TexCoords.Right, area.TexCoords.Top); tQuad[2] = new CustomVertex.TransformedTextured(area.Area.Left, area.Area.Bottom, 1, 1, area.TexCoords.Left, area.TexCoords.Bottom); tQuad[3] = new CustomVertex.TransformedTextured(area.Area.Right, area.Area.Bottom, 1, 1, area.TexCoords.Right, area.TexCoords.Bottom); // render quad device.SetTexture(0, (Texture)area.Data); device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, tQuad); } device.EndScene(); } } } device.SetRenderTarget(0, rt0); device.RenderState.ZBufferEnable = true; return(null); }
public void LoadVisualization(DataProfile dataProfile, DataProfile.SubProfile subProfile, IDataSourceReader dataSrcReader, DataSourceInfo dataSrcInfo) { renderFrame = true; renderingThread.Start(); controlStatus = ControlStatus.Loading; rContext.LoadingLayer.SetProgress(0); rContext.LoadingLayer.SetText("Loading... DEM Geometry"); rContext.LoadingLayer.Visible = true; Render(); // load data from dlg into database database = new RasterDatabase.RasterDatabase(); object filteredData = subProfile.Filter.FilterData(dataSrcReader); if (filteredData is byte[]) { DataLayer dataLayer = new DataLayer("DEM", 8, "byte"); dataLayer.AddArea(new ByteArea(new Rectangle(new Point(), dataSrcReader.Info.Resolution), new RectangleF(0, 0, 1, 1), (byte[])filteredData, dataSrcReader.Info.Resolution)); database.AddLayer(dataLayer); } else if (filteredData is float[]) { DataLayer dataLayer = new DataLayer("DEM", 32, "float"); dataLayer.AddArea(new FloatArea(new Rectangle(new Point(), dataSrcReader.Info.Resolution), new RectangleF(0, 0, 1, 1), (float[])filteredData, dataSrcReader.Info.Resolution)); database.AddLayer(dataLayer); } // load data source(s) DataSourceItem item = new DataSourceItem(dataSrcInfo.BppType, (Bitmap)PreviewRasterizer.DrawRotatedBandPreview(dataSrcInfo.Bands, 64, dataSrcInfo)); heightDataSrcs.Add(item); // load diffuse sources // grey-scale for height GreyScaleDEMSampler srcImgSampler = new GreyScaleDEMSampler(); Bitmap srcImg = srcImgSampler.GenerateBitmap(new Size(64, 64), database.Layers[0].Areas[0]); item = new DataSourceItem("Height", srcImg); item.DEMSampler = srcImgSampler; //(Bitmap)PreviewRasterizer.DrawRotatedBandPreview(new DataSourceInfo.DataBandInfo[] { new DataSourceInfo.DataBandInfo("Source", srcImg) }, //64, null)); diffuseDataSrcs.Add(item); // load colour image if possible as other source (i.e the original if an RGB img) if (dataSrcReader.Info.SupportsRGB()) { item = new DataSourceItem("SourceRGB", SourceDataDiffuseSampler.SampleRGBDiffuseMap((GDALReader)dataSrcReader, new Size(64, 64))); diffuseDataSrcs.Add(item); reader = (GDALReader)dataSrcReader; } // height band range HeightBandRange hbr = new HeightBandRange(); hbr.AddBand(0, Color.DarkGreen); hbr.AddBand(0.25f, Color.Blue); hbr.AddBand(0.4f, Color.DarkGreen); hbr.AddBand(0.5f, Color.Green); hbr.AddBand(0.8f, Color.Gray); hbr.AddBand(1, Color.White); HeightBandDEMSampler hBandSampler = new HeightBandDEMSampler(hbr); item = new DataSourceItem("HeightBands", hBandSampler.GenerateBitmap(new Size(64, 64), database.Layers[0].Areas[0])); item.DEMSampler = hBandSampler; diffuseDataSrcs.Add(item); // load database into visualization dem = new DigitalElevationMap(database.Area.Size, database, rContext.DevIf, (GDALReader)dataSrcReader/*, hBandSampler.GenerateBitmap(new Size(512, 512), database.Layers[0].Areas[0])*/ ); rContext.SetDEM(dem); // setup geometry layers geometryLayers.Add(new GeometryVisLayer("Diffuse", item.Thumbnail, true)); geometryLayers.Add(new GeometryVisLayer("Overlay Grid", null, true)); rContext.DevIf.LocalSettings["GeometryVisLayer.Diffuse"] = geometryLayers[0]; rContext.DevIf.LocalSettings["GeometryVisLayer.Overlay"] = geometryLayers[1]; // now load default texture SetDiffuseSource(0); rContext.LoadingLayer.SetProgress(100); Render(); Thread.Sleep(500); rContext.LoadingLayer.Visible = false; controlStatus = ControlStatus.Idle; Render(); }