Ejemplo n.º 1
0
        public void SetRayData <T>(T[] rays)
            where T : struct
        {
            if (rays == null || rays.Length == 0)
            {
                return;
            }

            var rayData = IntPtr.Zero;
            var rayPtr  = GCHandle.Alloc(rays, GCHandleType.Pinned);

            CheckError(TraversalApi.rtuTraversalMapRays(mTraversal, (uint)rays.Length, ref rayData));

            if (rayData == IntPtr.Zero)
            {
                throw new OptixException("Traversal Error: Ray buffer cannot be mapped");
            }
            var raySpan = new Span <T>(rays);

            MemoryHelper.CopyFromManaged(ref raySpan, rayData, (uint)rays.Length);
            //Unsafe.Copy(rayData.ToPointer(), ref rays);

            CheckError(TraversalApi.rtuTraversalUnmapRays(mTraversal));
            mCurrentNumRays = rays.Length;
            rayPtr.Free();
        }
Ejemplo n.º 2
0
 protected void CheckError(RTresult result)
 {
     if (result != RTresult.RT_SUCCESS)
     {
         TraversalApi.rtuTraversalGetErrorString(mTraversal, result, out var message);
         throw new OptixException($"Optix traversal error : {message} {GetType().Name}");
     }
 }
Ejemplo n.º 3
0
 public TraversalEngine(Context context, QueryType query, RayFormat rayFormat, TriFormat triFormat,
                        TraversalOutput outputs, InitOptions options)
 {
     mRayFormat = rayFormat;
     mRaySize   = rayFormat == RayFormat.OriginDirectionInterleaved ? 24 : 32;
     CheckError(TraversalApi.rtuTraversalCreate(ref mTraversal, (RTUquerytype)query, (RTUrayformat)rayFormat,
                                                (RTUtriformat)triFormat, (uint)outputs, (uint)options, context.InternalPtr));
 }
Ejemplo n.º 4
0
 public void Dispose()
 {
     if (mTraversal != IntPtr.Zero)
     {
         TraversalApi.rtuTraversalDestroy(mTraversal);
         mTraversal = IntPtr.Zero;
     }
 }
Ejemplo n.º 5
0
        public void SetMesh(Vector3[] vertices, int[] indices)
        {
            var vertHandle = GCHandle.Alloc(vertices, GCHandleType.Pinned);
            var indHandle  = GCHandle.Alloc(indices, GCHandleType.Pinned);

            CheckError(TraversalApi.rtuTraversalSetMesh(mTraversal, (uint)vertices.Length, vertHandle.AddrOfPinnedObject(),
                                                        (uint)indices.Length / 3, indHandle.AddrOfPinnedObject()));
            vertHandle.Free();
            indHandle.Free();
        }
Ejemplo n.º 6
0
        public TraversalStream <T> MapRays <T>(int numRays)
            where T : struct
        {
            mCurrentNumRays = numRays;

            var rays = IntPtr.Zero;

            CheckError(TraversalApi.rtuTraversalMapRays(mTraversal, (uint)numRays, ref rays));

            var stream = new BufferStream(rays, mRaySize * numRays, true, true, false);

            return(new TraversalStream <T>(stream));
        }
Ejemplo n.º 7
0
        public TraversalStream <TraversalResult> MapResults()
        {
            IntPtr results = IntPtr.Zero;

            CheckError(TraversalApi.rtuTraversalMapResults(mTraversal, ref results));

            if (results == IntPtr.Zero)
            {
                throw new OptixException("Traversal Error: Results buffer cannot be mapped");
            }

            var stream = new BufferStream(results, 8 * mCurrentNumRays, true, false, false);

            return(new TraversalStream <TraversalResult>(stream));
        }
Ejemplo n.º 8
0
        public void GetResults(TraversalResult[] results)
        {
            if (results == null || results.Length == 0)
            {
                return;
            }

            var resultData = IntPtr.Zero;
            var resultsPtr = GCHandle.Alloc(results, GCHandleType.Pinned);


            CheckError(TraversalApi.rtuTraversalMapResults(mTraversal, ref resultData));

            if (resultData == IntPtr.Zero)
            {
                throw new OptixException("Traversal Error: Results buffer cannot be mapped");
            }

            MemoryHelper.BlitMemory(resultsPtr.AddrOfPinnedObject(), resultData, (uint)(mCurrentNumRays * 8u));

            CheckError(TraversalApi.rtuTraversalUnmapResults(mTraversal));
            resultsPtr.Free();
        }
Ejemplo n.º 9
0
        public void GetBaryCentricOutput(Vector2[] output)
        {
            if (output.Length != mCurrentNumRays)
            {
                throw new ArgumentOutOfRangeException("output", "Output array must equal number of rays set on the Traversal object");
            }

            IntPtr outputData = IntPtr.Zero;

            CheckError(TraversalApi.rtuTraversalMapOutput(mTraversal, RTUoutput.RTU_OUTPUT_BARYCENTRIC, ref outputData));

            if (outputData == IntPtr.Zero)
            {
                throw new OptixException("Traversal Error: NormalOutput buffer cannot be mapped");
            }
            var lc = GCHandle.Alloc(output, GCHandleType.Pinned);

            var span = new Span <Vector2>(output);

            MemoryHelper.CopyFromUnmanaged(outputData, ref span, (uint)mCurrentNumRays);

            CheckError(TraversalApi.rtuTraversalUnmapOutput(mTraversal, RTUoutput.RTU_OUTPUT_BARYCENTRIC));
            lc.Free();
        }
Ejemplo n.º 10
0
 public void UnmapRays()
 {
     CheckError(TraversalApi.rtuTraversalUnmapRays(mTraversal));
 }
Ejemplo n.º 11
0
 public void Preprocess()
 {
     CheckError(TraversalApi.rtuTraversalPreprocess(mTraversal));
 }
Ejemplo n.º 12
0
 public void Traverse()
 {
     CheckError(TraversalApi.rtuTraversalTraverse(mTraversal));
 }
Ejemplo n.º 13
0
 public void SetCpuThreadCount(int threadsCount)
 {
     CheckError(TraversalApi.rtuTraversalSetOption(mTraversal, Native.Prime.RunTimeOptions.NumThreads, MemoryHelper.AddressOf(threadsCount)));
 }