/// <summary> /// Adds a new entry in the tile cache, clears an entry if max capacity is reached. /// </summary> /// <param name="address">The tile address.</param> /// <param name="featureCollections">The list of feature collections to store.</param> public void Add(TileAddress address, IEnumerable <FeatureCollection> featureCollections) { lock (cache) { TileCacheEntry cacheEntry = null; if (cache.Count > 0) { cacheEntry = this.cache.FirstOrDefault(entry => entry.address.Equals(address)); } // No entry for this address, queue a new one and // free the cache if maximum capacity is reached if (cacheEntry == null) { var entry = new TileCacheEntry(); entry.address = address; entry.featureCollections = featureCollections; cache.Enqueue(entry); if (cache.Count > capacity) { cache.Dequeue(); } } else { // Update the entry with the new data if necessary cacheEntry.featureCollections = featureCollections; } } }
private void RenderTileCacheEntry( DeviceContext deviceContext, Camera camera, int datasetExtentDataSpaceX, int datasetExtentDataSpaceY, TileCacheEntry tileCacheEntry, Viewport viewport ) { //Check if this tile is over the edge of the image var tileMinExtentX = tileCacheEntry.CenterDataSpace.X - ( tileCacheEntry.ExtentDataSpace.X / 2f ); var tileMinExtentY = tileCacheEntry.CenterDataSpace.Y - ( tileCacheEntry.ExtentDataSpace.Y / 2f ); var tileMaxExtentX = tileCacheEntry.CenterDataSpace.X + ( tileCacheEntry.ExtentDataSpace.X / 2f ); var tileMaxExtentY = tileCacheEntry.CenterDataSpace.Y + ( tileCacheEntry.ExtentDataSpace.Y / 2f ); var tileProportionClipX = 1f; var tileProportionClipY = 1f; if ( datasetExtentDataSpaceX > 0 && tileMaxExtentX > datasetExtentDataSpaceX ) { tileProportionClipX = 1 - ( ( tileMaxExtentX - datasetExtentDataSpaceX ) / ( tileMaxExtentX - tileMinExtentX ) ); tileMaxExtentX = datasetExtentDataSpaceX; } if ( datasetExtentDataSpaceY > 0 && tileMaxExtentY > datasetExtentDataSpaceY ) { tileProportionClipY = 1 - ( ( tileMaxExtentY - datasetExtentDataSpaceY ) / ( tileMaxExtentY - tileMinExtentY ) ); tileMaxExtentY = datasetExtentDataSpaceY; } var p1 = new Vector3( tileMinExtentX, tileMinExtentY, 0.5f ); var p2 = new Vector3( tileMinExtentX, tileMaxExtentY, 0.5f ); var p3 = new Vector3( tileMaxExtentX, tileMaxExtentY, 0.5f ); var p4 = new Vector3( tileMaxExtentX, tileMinExtentY, 0.5f ); var t1 = new Vector3( 0f, 0f, 0f ); var t2 = new Vector3( 0f, tileProportionClipY, 0f ); var t3 = new Vector3( tileProportionClipX, tileProportionClipY, 0f ); var t4 = new Vector3( tileProportionClipX, 0f, 0f ); DataBox databox; databox = deviceContext.MapSubresource( mPositionVertexBuffer, 0, QUAD_NUM_VERTICES * POSITION_NUM_COMPONENTS_PER_VERTEX * POSITION_NUM_BYTES_PER_COMPONENT, MapMode.WriteDiscard, SlimDX.Direct3D11.MapFlags.None ); databox.Data.Write( p1 ); databox.Data.Write( p4 ); databox.Data.Write( p2 ); databox.Data.Write( p3 ); deviceContext.UnmapSubresource( mPositionVertexBuffer, 0 ); databox = deviceContext.MapSubresource( mTexCoordVertexBuffer, 0, QUAD_NUM_VERTICES * TEXCOORD_NUM_COMPONENTS_PER_VERTEX * TEXCOORD_NUM_BYTES_PER_COMPONENT, MapMode.WriteDiscard, SlimDX.Direct3D11.MapFlags.None ); databox.Data.Write( t1 ); databox.Data.Write( t4 ); databox.Data.Write( t2 ); databox.Data.Write( t3 ); deviceContext.UnmapSubresource( mTexCoordVertexBuffer, 0 ); deviceContext.InputAssembler.InputLayout = mInputLayout; deviceContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleStrip; deviceContext.InputAssembler.SetVertexBuffers( POSITION_SLOT, new VertexBufferBinding( mPositionVertexBuffer, POSITION_NUM_COMPONENTS_PER_VERTEX * POSITION_NUM_BYTES_PER_COMPONENT, 0 ) ); deviceContext.InputAssembler.SetVertexBuffers( TEXCOORD_SLOT, new VertexBufferBinding( mTexCoordVertexBuffer, TEXCOORD_NUM_COMPONENTS_PER_VERTEX * TEXCOORD_NUM_BYTES_PER_COMPONENT, 0 ) ); mEffect.GetVariableByName( "gSourceTexture3D" ).AsResource().SetResource( tileCacheEntry.D3D11CudaTextures.Get( "SourceMap" ) ); if ( mTileManager.SegmentationLoaded ) { //if ( tileCacheEntry.D3D11CudaTextures.Internal.ContainsKey( "IdMap" ) ) //{ // mEffect.GetVariableByName( "gIdTexture3D" ).AsResource().SetResource( tileCacheEntry.D3D11CudaTextures.Get( "IdMap" ) ); //} //else //{ // System.Console.WriteLine("Warning: expected IdMap not found."); //} mEffect.GetVariableByName( "gIdTexture3D" ).AsResource().SetResource( tileCacheEntry.D3D11CudaTextures.Get( "IdMap" ) ); mEffect.GetVariableByName( "gIdColorMapBuffer" ).AsResource().SetResource( mTileManager.Internal.GetIdColorMap() ); mEffect.GetVariableByName( "gLabelIdMapBuffer" ).AsResource().SetResource( mTileManager.Internal.GetLabelIdMap() ); mEffect.GetVariableByName( "gIdConfidenceMapBuffer" ).AsResource().SetResource( mTileManager.Internal.GetIdConfidenceMap() ); if ( tileCacheEntry.D3D11CudaTextures.Internal.ContainsKey( "OverlayMap" ) ) { mEffect.GetVariableByName( "gOverlayTexture3D" ).AsResource().SetResource( tileCacheEntry.D3D11CudaTextures.Get( "OverlayMap" ) ); } } mEffect.GetVariableByName( "gTransform" ).AsMatrix().SetMatrix( camera.GetLookAtMatrix() * camera.GetProjectionMatrix() ); mEffect.GetVariableByName( "gSegmentationRatio" ).AsScalar().Set( mTileManager.SegmentationVisibilityRatio ); mEffect.GetVariableByName( "gBoundaryLinesVisible" ).AsScalar().Set( mTileManager.ShowBoundaryLines ); mEffect.GetVariableByName( "gBrushVisible" ).AsScalar().Set( mTileManager.SelectedSegmentId != 0 ); mEffect.GetVariableByName( "gSelectedSegmentId" ).AsScalar().Set( mTileManager.SelectedSegmentId ); mEffect.GetVariableByName( "gMouseOverSegmentId" ).AsScalar().Set( mTileManager.MouseOverSegmentId ); mEffect.GetVariableByName( "gMouseOverX" ).AsScalar().Set( ( mTileManager.MouseOverX - tileMinExtentX ) / tileCacheEntry.ExtentDataSpace.X ); mEffect.GetVariableByName( "gMouseOverY" ).AsScalar().Set( ( mTileManager.MouseOverY - tileMinExtentY ) / tileCacheEntry.ExtentDataSpace.Y ); mEffect.GetVariableByName( "gMouseHighlightSize" ).AsScalar().Set( mTileManager.BrushSize ); mPass.Apply( deviceContext ); deviceContext.Draw( QUAD_NUM_VERTICES, 0 ); //mDebugRenderer.RenderQuadWireframeOnly( deviceContext, p1, p2, p3, p4, new Vector3( 1, 0, 0 ), camera ); }
private void RenderTileCacheEntry(DeviceContext deviceContext, Camera camera, int datasetExtentDataSpaceX, int datasetExtentDataSpaceY, TileCacheEntry tileCacheEntry) { //Check if this tile is over the edge of the image var tileMinExtentX = tileCacheEntry.CenterDataSpace.X - (tileCacheEntry.ExtentDataSpace.X / 2f); var tileMinExtentY = tileCacheEntry.CenterDataSpace.Y - (tileCacheEntry.ExtentDataSpace.Y / 2f); var tileMaxExtentX = tileCacheEntry.CenterDataSpace.X + (tileCacheEntry.ExtentDataSpace.X / 2f); var tileMaxExtentY = tileCacheEntry.CenterDataSpace.Y + (tileCacheEntry.ExtentDataSpace.Y / 2f); var tileProportionClipX = 1f; var tileProportionClipY = 1f; if (datasetExtentDataSpaceX > 0 && tileMaxExtentX > datasetExtentDataSpaceX) { tileProportionClipX = 1 - ((tileMaxExtentX - datasetExtentDataSpaceX) / (tileMaxExtentX - tileMinExtentX)); tileMaxExtentX = datasetExtentDataSpaceX; } if (datasetExtentDataSpaceY > 0 && tileMaxExtentY > datasetExtentDataSpaceY) { tileProportionClipY = 1 - ((tileMaxExtentY - datasetExtentDataSpaceY) / (tileMaxExtentY - tileMinExtentY)); tileMaxExtentY = datasetExtentDataSpaceY; } var p1 = new Vector3(tileMinExtentX, tileMinExtentY, 0.5f); var p2 = new Vector3(tileMinExtentX, tileMaxExtentY, 0.5f); var p3 = new Vector3(tileMaxExtentX, tileMaxExtentY, 0.5f); var p4 = new Vector3(tileMaxExtentX, tileMinExtentY, 0.5f); var t1 = new Vector3(0f, 0f, 0f); var t2 = new Vector3(0f, tileProportionClipY, 0f); var t3 = new Vector3(tileProportionClipX, tileProportionClipY, 0f); var t4 = new Vector3(tileProportionClipX, 0f, 0f); DataBox databox; databox = deviceContext.MapSubresource(mPositionVertexBuffer, 0, QUAD_NUM_VERTICES * POSITION_NUM_COMPONENTS_PER_VERTEX * POSITION_NUM_BYTES_PER_COMPONENT, MapMode.WriteDiscard, SlimDX.Direct3D11.MapFlags.None); databox.Data.Write(p1); databox.Data.Write(p4); databox.Data.Write(p2); databox.Data.Write(p3); deviceContext.UnmapSubresource(mPositionVertexBuffer, 0); databox = deviceContext.MapSubresource(mTexCoordVertexBuffer, 0, QUAD_NUM_VERTICES * TEXCOORD_NUM_COMPONENTS_PER_VERTEX * TEXCOORD_NUM_BYTES_PER_COMPONENT, MapMode.WriteDiscard, SlimDX.Direct3D11.MapFlags.None); databox.Data.Write(t1); databox.Data.Write(t4); databox.Data.Write(t2); databox.Data.Write(t3); deviceContext.UnmapSubresource(mTexCoordVertexBuffer, 0); deviceContext.InputAssembler.InputLayout = mInputLayout; deviceContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleStrip; deviceContext.InputAssembler.SetVertexBuffers(POSITION_SLOT, new VertexBufferBinding(mPositionVertexBuffer, POSITION_NUM_COMPONENTS_PER_VERTEX * POSITION_NUM_BYTES_PER_COMPONENT, 0)); deviceContext.InputAssembler.SetVertexBuffers(TEXCOORD_SLOT, new VertexBufferBinding(mTexCoordVertexBuffer, TEXCOORD_NUM_COMPONENTS_PER_VERTEX * TEXCOORD_NUM_BYTES_PER_COMPONENT, 0)); mEffect.GetVariableByName("gSourceTexture3D").AsResource().SetResource(tileCacheEntry.D3D11CudaTextures.Get("SourceMap")); if (mTileManager.SegmentationLoaded) { //if ( tileCacheEntry.D3D11CudaTextures.Internal.ContainsKey( "IdMap" ) ) //{ // mEffect.GetVariableByName( "gIdTexture3D" ).AsResource().SetResource( tileCacheEntry.D3D11CudaTextures.Get( "IdMap" ) ); //} //else //{ // System.Console.WriteLine("Warning: expected IdMap not found."); //} mEffect.GetVariableByName("gIdTexture3D").AsResource().SetResource(tileCacheEntry.D3D11CudaTextures.Get("IdMap")); mEffect.GetVariableByName("gIdColorMapBuffer").AsResource().SetResource(mTileManager.Internal.GetIdColorMap()); mEffect.GetVariableByName("gLabelIdMapBuffer").AsResource().SetResource(mTileManager.Internal.GetLabelIdMap()); mEffect.GetVariableByName("gIdConfidenceMapBuffer").AsResource().SetResource(mTileManager.Internal.GetIdConfidenceMap()); } mEffect.GetVariableByName("gTransform").AsMatrix().SetMatrix(camera.GetLookAtMatrix() * camera.GetProjectionMatrix()); mEffect.GetVariableByName("gSegmentationRatio").AsScalar().Set(mTileManager.SegmentationVisibilityRatio); mEffect.GetVariableByName("gBoundaryLinesVisible").AsScalar().Set(mTileManager.ShowBoundaryLines); mEffect.GetVariableByName("gSelectedSegmentId").AsScalar().Set(mTileManager.SelectedSegmentId); mEffect.GetVariableByName("gMouseOverSegmentId").AsScalar().Set(mTileManager.MouseOverSegmentId); mPass.Apply(deviceContext); deviceContext.Draw(QUAD_NUM_VERTICES, 0); //mDebugRenderer.RenderQuadWireframeOnly( deviceContext, p1, p2, p3, p4, new Vector3( 1, 0, 0 ), camera ); }