unsafe PointCloudBounds GetBounds(AssetImportContext context, byte *ptr, int stride, int count, List <PointElement> elements) { var name = Path.GetFileName(context.assetPath); var counts = new NativeArray <int>(JobsUtility.MaxJobThreadCount, Allocator.TempJob); var bounds = new NativeArray <PointCloudBounds>(JobsUtility.MaxJobThreadCount, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); for (int i = 0; i < bounds.Length; i++) { bounds[i] = PointCloudBounds.Empty; } try { var job = new PointCloudGetBoundsJob() { X = GetInputAccess(PointElementName.X, elements, ptr, stride), Y = GetInputAccess(PointElementName.Y, elements, ptr, stride), Z = GetInputAccess(PointElementName.Z, elements, ptr, stride), Bounds = (PointCloudBounds *)bounds.GetUnsafePtr(), Counts = (int *)counts.GetUnsafePtr(), ThreadIndex = 0, }; var h = job.Schedule((int)count, 65536); while (!h.IsCompleted) { System.Threading.Thread.Sleep(100); int processed = counts.Sum(); float progress = (float)((double)processed / count); EditorUtility.DisplayProgressBar($"Importing {name}", $"{processed:N0} points", progress); } var result = PointCloudBounds.Empty; foreach (var b in bounds) { if (b.IsValid) { result.Add(b.MinX, b.MinY, b.MinZ); result.Add(b.MaxX, b.MaxY, b.MaxZ); } } return(result); } finally { EditorUtility.ClearProgressBar(); bounds.Dispose(); counts.Dispose(); } }
public static PointCloudBounds CalculateBounds(MemoryMappedViewAccessor accessor, long count, int stride, List <PointElement> elements, string progressBarTitle = null) { var maxArraySize = TreeUtility.CalculateMaxArraySize(stride); if (count > maxArraySize) { Debug.LogWarning( $"Too many points ({count:n0}), truncating to {maxArraySize:n0}"); count = maxArraySize; } unsafe { byte *ptr = null; accessor.SafeMemoryMappedViewHandle.AcquirePointer(ref ptr); try { var counts = new NativeArray <int>(JobsUtility.MaxJobThreadCount, Allocator.TempJob); var bounds = new NativeArray <PointCloudBounds>(JobsUtility.MaxJobThreadCount, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); for (var i = 0; i < bounds.Length; i++) { bounds[i] = PointCloudBounds.Empty; } try { var job = new PointCloudGetBoundsJob() { X = GetInputAccess(PointElementName.X, elements, ptr, stride), Y = GetInputAccess(PointElementName.Y, elements, ptr, stride), Z = GetInputAccess(PointElementName.Z, elements, ptr, stride), Bounds = (PointCloudBounds *)bounds.GetUnsafePtr(), Counts = (int *)counts.GetUnsafePtr(), ThreadIndex = 0, }; var h = job.Schedule((int)count, 65536); while (!h.IsCompleted) { System.Threading.Thread.Sleep(100); var processed = counts.Sum(); var progress = (float)((double)processed / count); EditorUtility.DisplayProgressBar( string.IsNullOrEmpty(progressBarTitle) ? "Calculating bounds" : progressBarTitle, $"{processed:N0} points", progress); } var result = PointCloudBounds.Empty; foreach (var b in bounds) { if (b.IsValid) { result.Add(b.MinX, b.MinY, b.MinZ); result.Add(b.MaxX, b.MaxY, b.MaxZ); } } return(result); } finally { EditorUtility.ClearProgressBar(); bounds.Dispose(); counts.Dispose(); } } finally { accessor.SafeMemoryMappedViewHandle.ReleasePointer(); } } }