Exemplo n.º 1
0
        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();
            }
        }
Exemplo n.º 2
0
        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();
                }
            }
        }