private BuildingInformation TryFetchBuildingInformationForHighlight(int buildingHighlightId) { BuildingInformation buildingInformation = null; BuildingInformationInterop buildingInfoInterop = new BuildingInformationInterop(); // call C++ api point to populate buffer size fields var success = NativeBuildingsApi_TryGetBuildingInformation(NativePluginRunner.API, buildingHighlightId, ref buildingInfoInterop); if (success) { // alloc + pin buffers var buildingIdBuffer = new byte[buildingInfoInterop.BuildingIdSize]; var buildingIdBufferGCHandle = GCHandle.Alloc(buildingIdBuffer, GCHandleType.Pinned); buildingInfoInterop.BuildingId = buildingIdBufferGCHandle.AddrOfPinnedObject(); var contourPointsBuffer = new LatLongInterop[buildingInfoInterop.ContourPointsSize]; var contourPointsBufferGCHandle = GCHandle.Alloc(contourPointsBuffer, GCHandleType.Pinned); buildingInfoInterop.ContourPoints = contourPointsBufferGCHandle.AddrOfPinnedObject(); var buildingContoursBuffer = new BuildingContourInterop[buildingInfoInterop.BuildingContoursSize]; var buildingContoursBufferGCHandle = GCHandle.Alloc(buildingContoursBuffer, GCHandleType.Pinned); buildingInfoInterop.BuildingContours = buildingContoursBufferGCHandle.AddrOfPinnedObject(); // call C++ api point again to populate buffers success = NativeBuildingsApi_TryGetBuildingInformation(NativePluginRunner.API, buildingHighlightId, ref buildingInfoInterop); if (success) { buildingInformation = CreateBuildingInformation(buildingInfoInterop, contourPointsBuffer, buildingContoursBuffer); } buildingIdBufferGCHandle.Free(); contourPointsBufferGCHandle.Free(); buildingContoursBufferGCHandle.Free(); } return(buildingInformation); }
private static BuildingInformation CreateBuildingInformation( BuildingInformationInterop buildingInfoInterop, LatLongInterop[] contourPointsBuffer, BuildingContourInterop[] buildingContoursBuffer) { var buildingContours = new List <BuildingContour>(); var contourPointsOffset = 0; for (int i = 0; i < buildingInfoInterop.BuildingContoursSize; ++i) { var buildingContourInterop = buildingContoursBuffer[i]; var pointCount = buildingContourInterop.PointCount; var points = new List <LatLong>(); for (int j = 0; j < pointCount; ++j) { points.Add(contourPointsBuffer[contourPointsOffset + j].ToLatLong()); } var buildingContour = new BuildingContour( buildingContourInterop.BottomAltitude, buildingContourInterop.TopAltitude, points.AsReadOnly()); buildingContours.Add(buildingContour); contourPointsOffset += pointCount; } var buildingInformation = new BuildingInformation( Marshal.PtrToStringAnsi(buildingInfoInterop.BuildingId, buildingInfoInterop.BuildingIdSize - 1), buildingInfoInterop.BuildingDimensions.ToBuildingDimensions(), buildingContours.AsReadOnly() ); return(buildingInformation); }
private static extern bool NativeBuildingsApi_TryGetBuildingInformation(IntPtr ptr, int buildingHighlightId, ref BuildingInformationInterop out_buildingInformation);